1. 程式人生 > >Java-JNA使用心得2

Java-JNA使用心得2

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