将UTF字符从c+发送到java+;使用jni

将UTF字符从c+发送到java+;使用jni,java,c++,character-encoding,java-native-interface,Java,C++,Character Encoding,Java Native Interface,我想将韩语(使用UTF的韩语符号)文本从C发送到JAVA。 但是JAVA得到了错误的结果 例如: JNIEXPORT jstring JNICALL Java_get_1term (JNIEnv *env, jobject, jint termInd) { const char *str = "음뮤원음직음원샘"; return (env)->NewStringUTF(str); } 但在这种情况下,JAVA得到了错误的字符串 我在其他帖子中找不到我的问题的答案,如果

我想将韩语(使用UTF的韩语符号)文本从C发送到JAVA。 但是JAVA得到了错误的结果 例如:

JNIEXPORT jstring JNICALL Java_get_1term
  (JNIEnv *env, jobject, jint termInd)
{
    const char *str = "음뮤원음직음원샘";
    return (env)->NewStringUTF(str);
}
但在这种情况下,JAVA得到了错误的字符串

我在其他帖子中找不到我的问题的答案,如果有相同的问题,请给我它们的链接

试试这个(摘自并改编自):


编辑正如@Kerrek SB正确指出的,这是一个仅限Windows的解决方案

Java不使用UTF-16BE吗?而您的C源代码具有完全依赖于平台的行为。在内部,java字符或jni jchar是无符号的16位类型。但是NewStringUTF需要一个UTF8字符指针。这应该行得通。谁说OP在Windows上工作?(尽管我承认Java在仅限于在Windows上运行时是非常平台独立的:-)您知道如何在Unix平台上做到这一点吗?
jstring WindowsToJstring(JNIEnv* pEnv, char* cstr) {
   jstring retJstring = NULL;
   int slen = strlen(cstr);
   int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)cstr, slen, NULL, 0 );
   unsigned short* tempbuffer = (unsigned short *)malloc( length*2 + 1 );
   MultiByteToWideChar( CP_ACP, 0, (LPCSTR)cstr, slen, (LPWSTR)tempbuffer, length );
   retJstring = (pEnv)->NewString((jchar*)tempbuffer, length );
   free( tempbuffer );
   return retJstring;
}