首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android jni 中文乱码,该怎么解决

2013-07-04 
android jni 中文乱码下面这个在java中调用就返回乱码了。JNIEXPORT jstring JNICALL Java_com_example_nat

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  好像是这个函数  可以去查一查


MultiByteToWideChar 这是windows API
Android 是linux内核不适用
[解决办法]
换用gbk解码看看。。
[解决办法]
你如果是直接在.c文件写中文的话 你保存成utf-8就可以了

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



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


热点排行