![](/img/trans.png)
[英]Are there C++ equivalents for the Protocol Buffers delimited I/O functions in Java?
[英]Java equivalents for C stdlib functions
我無法拿出更好的標題,所以在這里。 我試圖找出從C的stdlib訪問方法的最佳方法(在效率和代碼明智的情況下)。為此的背景是,我試圖在Java程序中獲得mbstowcs的功能。 現在,在我的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);
我本質上想做的是使用JNA從Java端調用此copyFilePath
。 訣竅是我需要在Java程序中獲得與C的mbstowcs相似的轉換,因此以后我可以直接調用此函數而無需任何其他處理。 就目前而言,在我看來,在使用JNI時我將需要其他C代碼,以便可以從stdlib獲取mbstowcs的包裝。
問題還在於,是否有Java可以像在C / C ++中一樣將Java的多字節字符串轉換為寬字符字符串的類似方法?
不回答問題,而是嘗試解決問題。 JNA具有com.sun.jna.WString
。 如果您調用帶有WString參數的Function,它將在本機代碼中顯示為寬字符串。 您只需要確保您具有正確的編碼即可。
代替function.invoke(myString);
這將在本地提供一個多字節字符串,只需使用function.invoke(new WString(myString));
將字節轉換為文本的簡單自然方法是使用字符串構造函數。 例如
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相似的轉換,因此以后我可以直接調用此函數而無需任何其他處理。
因此,簡單的方法是:
byte[]
或String
)。 byte[]
或String
或其他內容傳遞給Java。 但是,值得注意的是Knuth關於過早優化的建議。 如果您經常越過Java /本機邊界,以至於這種優化是值得的,則(IMO)應該重新考慮應用程序的更大設計;否則,您可能會遇到問題。 例如,為什么您的Java如此密集地調用本機代碼(反之亦然)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.