亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C stdlib 函數的 Java 等效項

C stdlib 函數的 Java 等效項

收到一只叮咚 2021-09-12 16:09:49
我想不出更好的標題,所以就在這里。我試圖找出從 C 的 stdlib 訪問方法的最佳方式(在效率和干凈的代碼明智的情況下)。 背景是我試圖在 Java 程序中獲得mbstowcs的功能?,F在在我的 C 代碼中,我得到了這個:const char* source = "D:\\test3\\source\\test.txt";SName tmp1;mbstowcs((wchar_t*)tmp1, source, 32 - 1);哪里SName是typedef unsigned short SName[32]。稍后在代碼tmp1中用作輸入參數:status = copyFilePath(tmp1, tmp2, info, &context);我本質上想做的是copyFilePath使用 JNA 從 Java 端調用它。訣竅是我需要在 Java 程序中對 C 的 mbstowcs 進行類似的轉換,以便稍后我可以直接調用此函數而無需任何額外處理?,F在在我看來,在使用 JNI 時我需要額外的 C 代碼,以便我可以從 stdlib 獲得 mbstowcs 的包裝器。問題還在于,Java 是否有任何類似的方法可以像在 C/C++ 中一樣將多字節字符串轉換為寬字符串以使其全部解決?
查看完整描述

2 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

不是回答問題,而是試圖幫助解決問題。JNA 有com.sun.jna.WString. 如果您使用 WString 參數調用函數,它將在本機代碼中顯示為寬字符串。你只需要確保你有正確的編碼。

而不是function.invoke(myString);它在本機端為您提供多字節字符串,只需使用function.invoke(new WString(myString));


查看完整回答
反對 回復 2021-09-12
?
隔江千里

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 如此密集地調用本機代碼(反之亦然)。


查看完整回答
反對 回復 2021-09-12
  • 2 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號