这两天调式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)如下



 

 

 

 

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