因为客户需要进行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 getFieldOrder() {
List Field = new ArrayList();
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)如下: