這兩天調式JNA的注意事項(JNA數據格式的轉換)

     因爲客戶需要進行java的PC界面開發,但是公司這邊關於java的我是在Android用過java開發 對於PC上還沒有做出相關的應用案例來。所幸的是客戶自己進行了開發然而不幸的事情也隨之而來哈哈。

 

當前所能獲取的情報:1.設備方(也是我了哈哈)-> 提供Windows下的dll文件以及開發文檔 總稱 Windows下的SDK開發包了

                                     2.SDK包含了 C++的使用示例(以前的工程師寫的) C#的使用示例 32位和64位DLL等

                                     3.客戶使用java開發 開發平臺是esplise 進行JNA開發 (雖然之前有過簡單的使用和學習但還不是很熟)

 出現的問題點:

typedef struct {
	int  nFontSize;
	int  nRotate;
	int  nWeight;
	int  nItalic;
	int  nUnderline;
	int  nStrikeOut;
	TCHAR szFaceName[LF_FACESIZE];
} SUP300_LOGFONT;
//這是dll中的一個結構體 


//客戶調用的方式如下:
//哈哈無疑 都是有問題的吶

//char[] SUP300_LOGFONT=new char[] {((int)50),0,0,0,0,900,font_name.charAt(0)};

		//char[] SUP300_LOGFONT=new char[] {50,0,0,0,0,900,"Times New Roman".charAt(0)};
//		String[] SUP300_LOGFONT = new String[] { 50 + "", 0 + "", 0 + "", 0 + "", 0 + "",
//				PrinterConfig.SUP300_FW_BLACK + "", new String(str.getBytes("gbk"), "utf-8")};
		//System.out.println(new String(str.getBytes("gbk"), "utf-8"));


		//char[] SUP300_text=new char[] {font_name.charAt(0)};

所以人在公司,鍋從天降。這就開始了我的接手改代碼之路

 

參建:Java調用C語言動態庫(JNA方式):回調函數、結構體數組傳參、結構體數組返回

java對DWORD和TCHAR的處理 

JNA實戰筆記彙總二 JNA和C/C++的數據類型轉換

 

經修改 我增加了JNA調用結構體的轉換

public interface XXXXXAPI extends Library {
		//dll需要注意自己的JDK是32位還是64位
		//XXXXXAPI 	需要使用32位JDK
		//XXXXXAPI64 	需要使用64位JDK
		XXXXXAPI INSTANCE = (XXXXXAPI) Native.loadLibrary("XXXXXAPI", XXXXXAPI.class);


		//JNA 結構體轉換XXXXX_LOGFONT
		public static  class XXXXX_LOGFONT extends Structure {
			public int nFontSize;
			public int nRotate;
			public int nWeight;
			public int nItalic;
			public int nUnderline;
			public int nStrikeOut;

			//public WString szFaceName;
			public byte[] szFaceName = new byte[64];

			//指針接口
			public static class ByReference extends XXXXX_LOGFONT implements Structure.ByReference {
			}

			//實體接口
			public static class ByValue extends XXXXX_LOGFONT implements Structure.ByValue {
			}

			//數據順序
			@Override
			protected List<String> getFieldOrder() {
				List<String> Field = new ArrayList<String>();
				Field.add("nFontSize");
				Field.add("nRotate");
				Field.add("nWeight");
				Field.add("nItalic");
				Field.add("nUnderline");
				Field.add("nStrikeOut");
				Field.add("szFaceName");
				return Field;
			}


		}
}

需要注意的是 我是用的是Idea 真香 esplise 我不會用😓 

注意的點 1.注意  XXXXXAPI.DLL 的平臺  需要對應的JDK

                2.結構體聲明中有兩個方法:ByValue 和 ByReference, 分別是值和引用

附上一個表 JNA的常用類型映射(Type Mappings)如下



 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章