下面这个在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

解决方案 »

  1.   

    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.javapublic class Test
    {
    static
    {
    System.loadLibrary("Test");
    }

    public static native String getString();

    public static void main(String[] args)
    {
    System.out.println(getString());
    }
    }
    Test.h/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Test */#ifndef _Included_Test
    #define _Included_Test
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     Test
     * Method:    getString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_Test_getString
      (JNIEnv *, jclass);#ifdef __cplusplus
    }
    #endif
    #endif
    Test.c#include <windows.h>
    #include "Test.h"/*
     * Class:     Test
     * Method:    getString
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_Test_getString
      (JNIEnv * env, jclass cl)
    {
    byte * bytes = "你好";
    jchar jchars[1024]; MultiByteToWideChar(CP_ACP, 0, bytes, -1, jchars, 1024);

    return (*env)->NewString(env, jchars, lstrlen(jchars));
    }
      

  2.   

    谢谢你,不过没有解决我的问题,我这个是android下的jni调用,没有#include <windows.h>。