Возврат арабского из звонка JNI - PullRequest
3 голосов
/ 16 марта 2011

Я пытался вернуть строку ARABIC из вызова JNI.

Метод java выглядит следующим образом:

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

lpszWord: ввод английский
lpszDest: игнорирование
m_flag: Ignore
lpszReserved: Ignore

Теперь, когда я использую 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;

}

Я считаю, что содержимое ARABIC находится внутри указателя на указатель «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.

1 Ответ

4 голосов
/ 16 марта 2011

Строки 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 внутри страны. .

...