因爲客戶需要進行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方式):回調函數、結構體數組傳參、結構體數組返回
經修改 我增加了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)如下: