2011-03-16 74 views
3

我一直試圖從JNI調用中返回一個ARABIC字符串。從JNI中返回阿拉伯數字

Java方法如下:

private native String ataTrans_CheckWord(String lpszWord, String lpszDest, int m_flag, int lpszReserved); 

lpszWord:輸入英文
lpszDest:忽略
M_FLAG:忽略
lpszReserved:忽略

現在,當我使用JAVAH生成的頭文件我得到一個帶有這個簽名的C++頭文件

JNIEXPORT jstring JNICALL Java_MyClass_ataTrans_1CheckWord (JNIEnv* env, jobject, jstring, jstring, jint , jint) 

現在,在此C++代碼我有語句,如本

JNIEXPORT jstring JNICALL Java_MyClass_ataTrans_1CheckWord(JNIEnv* env, jobject, jstring jstrInput,  jstring, jint , jint) 
{  

char aa[10]; 
char* bb; 
char** cc; 
bb = aa; 
cc = &bb; 
jstring tempValue; 

const char* strCIn = (env)->GetStringUTFChars(jstrInput , &blnIsCopy); 

int retVal = pDllataTrans_CheckWord(strCIn, cc, m_flag, lpszReserved); 

printf("Orginal Arabic Conversion Index 0: %s \n",cc[0]); //This prints ARABIC properly 

tempValue = (env)->NewString((jchar*)cc[0],10); // convert char array to jstring 

printf("JSTRING UNICODE Created : %s \n",tempValue); //This prints junk 

return tempValue; 

} 

相信阿拉伯文內容是指向指針的指針「CC」的內部。最後在我的java代碼中,我有這樣的一個電話

String temp = myclassInstance.ataTrans_CheckWord("ABCDEFG", "",1, 0); 

System.out.println("FROM JAVE OUTPUT : "+temp); //Prints Junk 

我只是不能返回一些阿拉伯字符出我的JAVA代碼。我正在做什麼錯?我試過了其他各種替代品,如

tempValue = env->NewStringUTF("شسيشسيشسيشس"); 

並返回tempValue但沒有運氣。它總是在JAVA端的垃圾。

回答

4

Java字符串在內部爲UTF-16,這是一種每個字符使用2或4個字節的編碼。您的翻譯系統似乎返回編碼爲MBCS(多字節字符集)的字符串 - 每個字符1 N個字節。

JNI NewString函數期望編碼爲UTF-16的數據,並且您還傳遞了其他內容 - 所以在java中,您將獲得垃圾數據。你的信息缺乏的一件事是你的翻譯系統使用哪種編碼。我假設它是UTF-8,並使用MultiByteToWideChar轉換爲java期望的格式。下面的代碼假設你在Windows上這樣做 - 如果沒有,請指定平臺,然後查看iconv庫。

int Len = strlen(cc[0])*2+2; 
wchar_t * Buffer = (wchar_t *) malloc(Len); 
MultiByteToWideChar(CP_UTF8, 0, cc[0], -1, Buffer, Len); 
tempValue = (env)->NewString((jchar*)Buffer,wcslen(Buffer)); 
free(Buffer); 

如果您獲得字符串作爲其他代碼頁,請替換上面的CP_UTF8。

作爲一個側面說明,如果編碼實際上 UTF-8,你可以簡單地通過你向cc[0]代替NewStringUTF - 這個函數處理UTF-8 UTF-16轉換內部。

+0

謝謝Erik.Brilliant。像魅力一樣工作。我只做了如下修改:\t \t MultiByteToWideChar(1256,0,cc [0],-1,Buffer,Len); – Franklin 2011-03-16 10:27:26

+0

@Franklin:好好:) – Erik 2011-03-16 10:29:59