Java-JNA使用心得2
阿新 • • 發佈:2017-10-20
long 回調函數 {} length 內存 指針 instance 加班 java封裝
自5月初第一次嘗試使用Java封裝調用C的dll之後,已經先後經歷了3次小項目了。
上月末是最近的一次項目實際,任務來的急時間又少,還好在加班加點後還是完成了任務,並把第二次沒有實現的功能給實現了(C的SDK獲取到圖片後由Java從內存中取出保存到本地)。
時間已經過去快1個月了,現把當初“攻克”的小難題給記錄一下。
現講一下當時的狀態,這個C的SDK是相機的SDK,使用賬戶密碼登錄相機,並註冊一個回調,當相機有抓拍之後會觸發回調函數,然後Java把數據從SDK中取出保存。
之前一直沒搞定的是Java通過SDK返回的圖片指針把圖片從內存中取出保存,這次趁著這個小項目而好好研究了一番。
實現關鍵代碼如下:
1、先是SDK中返回數據的結構體
typedef struct tagPhotoHandler { CHAR *apcData[PIC_NUM]; //圖片數據的指針數組 ULONG aulDataLen[PIC_NUM]; //每張圖片的數據長度 ... }
2、然後是Java對這個結構體的封裝
public static class tagPhotoHandler extends Structure { public static class ByReference extends myStructur implements Structure.ByReference{} public ByteByReference[] apcData = new ByteByReference[PIC_NUM]; public int[] aulDataLen = new int[PIC_NUM]; ... }
3、Java通過指針去內存中取數據
tagPhotoHandler.ByReference tumph = new tagPhotoHandler.ByReference(); ByteByReference[] picData = tumph.apcData; Pointer p = picData[i].getPointer(); Byte[] image = p.getByteArray(0,tumph.aulDataLen[i]);
4、其他一些較實用的東西
Pointer pConfig = new Memory(length); //指針轉結構體 public static <T extends Structure> T pointer2Structure(Pointer pParam,Class<T> res) { T Param; Param = res.newInstance(); Pointer facePointer = Param.getPointer(); facePointer.write(0,pParam.getByteArray(0,Param.size()),0,Param.size()); Param.read(); return Param; }
Java-JNA使用心得2