目前我android 通过 JNI 调用 C的字符串 英语 没什么问题,
但中文 不知改如何弄。
中文在 C 传入 JNI 生成 JString 时 爆掉 (因为是乱码,估计不行)
因为 java 和 jni以及 C 的编码不一样, 我想求个流程。JNIEXPORT jstring  JNICALL Java_com_taotektao_ni_JNIMyText_getTextElementStr(JNIEnv * env, jobject  obj,int index)
{
char string[256] = {0};
jstring str;
jchar * pjchar; GetTextElement(index,string);           //c中获取字符串 streing
str =  (*env)->NewStringUTF(env,string);  // 生成 jstring 时如果中文爆掉
return str;}

解决方案 »

  1.   

    恩 因为存储字节数不一致 才导致的乱码
    使用wchar 统一2字节封装后给jstring
    不要str = (*env)->NewStringUTF(env,string); 
    这只有在英文纯ASCII码才适用
      

  2.   

    中文还要考虑编码,其实挺麻烦的,我一般都是在JNI中return char二维数组,然后将在java层去处理显示,因为android只能是显示unicode,所以转码的工作都交给外部来做。
      

  3.   

    http://www.cublog.cn/u2/85193/showart_1921567.html
    晚上都是用的windows.h里带的转码函数,但是我认为比较麻烦,而且如果参数传错了可能就直接挂JNI里了,调试非常麻烦,所以我还是建议我上面说的那种方式,比较安全。
      

  4.   

    char* jstringToWindows( JNIEnv *env, jstring jstr )
    { //UTF8/16转换成gb2312
      int length = (env)->GetStringLength(jstr );
      const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
      char* rtn = (char*)malloc( length*2+1 );
      int size = 0;
      size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
      if( size <= 0 )
        return NULL;
      (env)->ReleaseStringChars(jstr, jcstr );
      rtn[size] = 0;
      return rtn;
    }jstring WindowsTojstring( JNIEnv* env, const char* str )
    {//gb2312转换成utf8/16
        jstring rtn = 0;
        int slen = strlen(str);
        unsigned short * buffer = 0;
        if( slen == 0 )
            rtn = (env)->NewStringUTF(str );
        else
        {
            int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
            buffer = (unsigned short *)malloc( length*2 + 1 );
            if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
                rtn = (env)->NewString(  (jchar*)buffer, length );
        }
        if( buffer )
            free( buffer );
        return rtn;
    }
      

  5.   

    恩,感谢大家。解决了。忘了结贴了。
    dinjay说的不错,给的例子只适用于WIN。但传字节的思路还是对的把编码处理,交给JAVA来做。