2011-07-12 58 views
1

我打電話JNI方法從Java應用程序與幾個字符串參數。 我正在使用env->GetStringChars(arg1, 0);來獲取該字符串。 問題是我有時會得到一些額外的特殊字符或字符串被截斷。字符串JNI得到額外的字符

+0

什麼是 'ENV'?你如何將字符串傳遞給JNI函數?那是什麼其他語言? – bezmax

+0

其他語言是C++ – marinnn

回答

0

最後,我找到了解決辦法

const jchar* raw = env->GetStringChars(string, NULL); 
if (raw == NULL) 
    return NULL; 

wchar_t* wsz = new wchar_t[len+1]; 
memcpy(wsz, raw, len*2); 
wsz[len] = 0; 

env->ReleaseStringChars(string, raw); 

return wsz; 
+2

這在'wchar_t'大於2個字節的平臺上無法正常工作。 –

+0

它在Win Mobile 6上使用。 – marinnn

1

在Java中,字符是16位的字符(UTF-16編碼)。如果你在C中將它們看作一個普通的char*,你將會看到nul個字節(它通常被視爲字符串的結尾)或其他特殊字符。

也許你應該使用UTF編碼,這避免NUL字符。你仍然需要處理UTF編碼的特殊字符。

http://java.sun.com/docs/books/jni/html/objtypes.html

+0

使用JNI函數的'UTF'變體幾乎總是一個壞主意,因爲它們使用的格式實際上不是UTF-8。如果你想以UTF-8字符串的形式獲得Java字符串的內容,你應該得到'jchar'數據並自己轉換它,或者讓Java代碼將字符串編碼成一個UTF-8'byte'數組並訪問代替。 –