日期:2014-05-20  浏览次数:20693 次

java jni 中文乱码
下面这个在java中调用就返回乱码了。
JNIEXPORT jstring JNICALL Java_com_example_nativeaudio_NativeAudio_readFromAssets(JNIEnv* env)
{
  return env->NewStringUTF("你好");
}
下面这个在java中调用没有问题,返回的是hello world
JNIEXPORT jstring JNICALL Java_com_example_nativeaudio_NativeAudio_readFromAssets(JNIEnv* env)
{
  return env->NewStringUTF("hello world");
}

网上查了下解决方案是:jni返回给java的字符串,c/c++首先应该负责把这个字符串变成UTF-8或者UTF-16格式
想问下有什么函数可以把字符串转换成UTF-8

------解决方案--------------------
NewStringUTF返回的是改良的UTF-8字符串,不是标准的UTF-8,用String.getBytes()好像不行

我一般传字符串都是用NewString函数来传的,NewString传的是UTF-16的字符串,和java内部的字符串编码一致

NewString函数的参数为jstring NewString(JNIEnv * env, const jchar chars[], jsize length);

jchar是宽字符,用的也是UTF-16编码,不能直接进行赋值,要靠调用操作系统的API来实现

例如Windows下面,将字符串转化为UTF-16的函数是MultiByteToWideChar

最后给你一个jni使用C语言在windows下返回“你好”的例子

Test.java
Java code

public class Test
{
    static
    {
        System.loadLibrary("Test");
    }
    
    public static native String getString();
    
    public static void main(String[] args)
    {
        System.out.println(getString());
    }
}