2010-11-17 114 views
1

我正在爲JNA調用一個用於C/C++的DLL API。 DLL中的函數API是短DKT_init(LPCSTR名稱)。我將相應的java方法作爲public DKT_init(String name);但是當我調用它時,DLL API返回一個參數錯誤。我想知道如何在JNA中映射LPCSTR?由於LPCSTR是cons char *,但String是char *。JNA在Windows平臺上映射LPCSTR

回答

0

您是否嘗試過將其映射到一個字節數組,像這樣:

short DKT_INIT(byte [] nameAsByteArray); 
//now you should be able to obtain it like this: 
System.out.println(new String(nameAsByteArray).trim()); 
1

字符串是LPCSTR適當的映射。 JNA將使用默認平臺編碼將修改後的UTF16字符轉換爲NUL終止的字節緩衝區。

您可以嘗試傳入一個明確的字節數組(使用上面建議的備用方法映射),這將消除不正確編碼問題的可能性,例如,

byte[] arg = { (byte)'f', (byte)'o', (byte)'o', (byte)0 }; 

您可以通過設置系統屬性「jna.encoding」來改變編碼。

您還應該消除「LPCSTR」實際上是錯誤類型的可能性;如果函數需要一個可以寫入的緩衝區,則String將不起作用,如果它實際上是LPTCSTR並且正在使用UNICODE,則需要傳遞一個WString。