开发者

Return Arabic from JNI call

开发者 https://www.devze.com 2023-02-17 07:21 出处:网络
I have been trying to return an ARABIC string from a JNI call. The java method is as follows private native String ataTrans_CheckWord(String lpszWord, String lpszDest, int m_flag, int lpszReserved);

I have been trying to return an ARABIC string from a JNI call.

The java method is as follows

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

lpszWord : Input English

lpszDest : Ignore

m_flag : Ignore

lpszReserved :Ignore

Now when I use javah to generate the header file I get a C++ header file with this signature

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

Now in this C++ code I have statements such as this

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)->开发者_StackOverflow社区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;

}

I believe the ARABIC content is inside the pointer to a pointer “cc”. Finally in my java code I have a call like this

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

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

I just can’t get to return some ARABIC character out into my JAVA code. Is there something wrong I am doing? I have tried out various other alternates such as

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

and return tempValue but no luck. Its always garbage on the JAVA side.


Java strings are internally UTF-16, an encoding which uses 2 or 4 bytes per character. Your translation system seems to return strings encoded in a MBCS (Multi-Byte Character Set) - 1-N bytes per character.

The JNI NewString function expects data encoded as UTF-16, and you're passing it something else - so in java you get garbage data. The one thing that is lacking from your information is which encoding your translation system uses. I'll assume it's UTF-8, and use MultiByteToWideChar to convert to the format java expects. The below code assumes that you're doing this on Windows - if not, specify platform, and look at e.g. the iconv library.

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);

If you get strings as some other codepage, replace CP_UTF8 above.

As a side note, if the encoding actually is UTF-8, you can simply pass your cc[0] to NewStringUTF instead - This function handles the UTF-8 to UTF-16 conversion internally.

0

精彩评论

暂无评论...
验证码 换一张
取 消