2 回答
TA貢獻1893條經驗 獲得超10個贊
不是回答問題,而是試圖幫助解決問題。JNA 有com.sun.jna.WString. 如果您使用 WString 參數調用函數,它將在本機代碼中顯示為寬字符串。你只需要確保你有正確的編碼。
而不是function.invoke(myString);它在本機端為您提供多字節字符串,只需使用function.invoke(new WString(myString));
TA貢獻1906條經驗 獲得超10個贊
將字節轉換為文本的簡單自然方法是使用字符串構造函數;例如
Charset charset = Charset.forName("UTF-8"); // for example, or use one of
// the predefined Charset constants in
// java.nio.charset.StandardCharsets
byte[] bytes = ...
String text = new String(bytes, charset);
在 Java 中做這種事情的有效方法是使用ByteBuffer和CharBuffer對象和一個CharsetDecoder頂部從前者填充后者。
但是這些方法在您使用零終止char*值時不起作用。Java 的標準 API 不支持零終止。(Java 數組具有明確定義的長度。)
我的建議是不要直接將您的代碼從 C/C++ 轉換為 Java。相反,將其從頭開始編寫為慣用的 Java 代碼。(如果您真的需要C 或 C++ 代碼的效率,請使用這些語言!)
我本質上想要做的是使用 JNA 從 Java 端調用這個 copyFilePath。訣竅是我需要在 Java 程序中對 C 的 mbstowcs 進行類似的轉換,以便稍后我可以直接調用此函數而無需任何額外處理。
所以簡單的方法是:
在本機代碼端轉換為 Java 可以處理的內容(例如abyte[]或 a String)。
通過 JNA將byte[]orString或任何內容傳遞給 Java。
讓 Java 端緩存它,以便不需要重復 JNA 調用。
但值得注意的是 Knuth 關于過早優化的建議。如果您經??缭?Java / 本機邊界以致這種優化是值得的,您應該 (IMO) 重新考慮應用程序的更大設計;例如,為什么您的 Java 如此密集地調用本機代碼(反之亦然)。
添加回答
舉報
