当前位置: 代码迷 >> Android >> android jni 中文乱码解决方案
  详细解决方案

android jni 中文乱码解决方案

热度:68   发布时间:2016-05-01 21:29:00.0
android 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

------解决方案--------------------
String str="XXXX";
str=new String(str.getBytes(), "UTF-8");
------解决方案--------------------
java层:输出中文:new String(str.getBytes(), "UTF-8"); str为jni返回的字符串
c/c++:MultiByteToWideChar 好像是这个函数 可以去查一查
------解决方案--------------------
探讨

java层:输出中文:new String(str.getBytes(), "UTF-8"); str为jni返回的字符串
c/c++:MultiByteToWideChar 好像是这个函数 可以去查一查

------解决方案--------------------
换用gbk解码看看。。
------解决方案--------------------
你如果是直接在.c文件写中文的话 你保存成utf-8就可以了

如果要转的话用这个代码 我一直在用的

C/C++ code
void (*ucnv_convert)(const char *,const char *, char * , int32_t , const char *, int32_t,int32_t*)=0; int dllOpencuuc() {            void* pDL = dlopen("/system/lib/libicuuc.so", RTLD_LAZY);       ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(pDL, "ucnv_convert_44");//ucnv_convert_44(2.3) ucnv_convert_4_2(2.2)          if(pDL)    {      dlclose(pDL);    }      if(ucnv_convert)      {                        return 1;      }else      {         ucnv_convert  = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(pDL, "ucnv_convert_46");//ucnv_convert_44(2.3) ucnv_convert_4_2(2.2) ucnv_convert_46(4.0)                  if(ucnv_convert)         {                         return 1;         }         ucnv_convert  = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(pDL, "ucnv_convert_4_2");         if(ucnv_convert)         {                         return 1;         }      }        return 0;       } int GB2312ToUtf8( char *CP,  char *inbuf ,  size_t _in_size , char *outbuf , size_t  _out_size ) {         int errcode = 0;     ucnv_convert("utf-8",CP, outbuf, _out_size, inbuf, _in_size,&errcode);    if(errcode)   {      return -1;   }   else   {     return 0;   }      } int Utf8ToGB2312(char *CP,char* inbuf, size_t _in_size, char* outbuf, size_t _out_size){   int errcode = 0;     ucnv_convert("GBK",CP, outbuf, _out_size, inbuf, _in_size,&errcode);    if(errcode)   {      return -1;   }   else   {     return 0;   }}
  相关解决方案