簡體   English   中英

C stdlib函數的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);

其中SNametypedef 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中執行此類操作的有效方法是使用ByteBufferCharBuffer對象,而CharsetDecoder則從前者填充后者。

但是,如果您使用的是零終止的char*值,那么這些方法將行不通。 Java的標准API不支持零終止。 (Java數組具有明確定義的長度。)

我的建議是不要將代碼直接從C / C ++轉換為Java。 而是從頭開始將其作為慣用的Java代碼編寫。 (如果您確實需要 C或C ++代碼的效率,請使用這些語言!)

我本質上想做的是使用JNA從Java端調用此copyFilePath。 訣竅是我需要在Java程序中獲得與C的mbstowcs相似的轉換,因此以后我可以直接調用此函數而無需任何其他處理。

因此,簡單的方法是:

  1. 在本機代碼端轉換為Java可以應付的東西(例如, byte[]String )。
  2. 通過JNA將byte[]String或其他內容傳遞給Java。
  3. 讓Java端對其進行緩存,這樣就無需重復JNA調用。

但是,值得注意的是Knuth關於過早優化的建議。 如果您經常越過Java /本機邊界,以至於這種優化是值得的,則(IMO)應該重新考慮應用程序的更大設計;否則,您可能會遇到問題。 例如,為什么您的Java如此密集地調用本機代碼(反之亦然)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM