Java-JNA使用心得2


自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;
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM