目前我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;}
但中文 不知改如何弄。
中文在 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;}
解决方案 »
- 请问在具体的View中设置Layoutparam和在Layout中设置Layoutparam有什么区别
- button或者imageview按下的时候变小,松开后还原 急急急。。在线等。
- android中AudioRecord录音,并实时转码为MP3进行保存
- 关于ViewFlipper的动态添加问题
- 一个android Timer,为什么只执行了一次
- 在Eclipse中启动Android程序过慢
- 调用getListView().getSelectedId()以后如何清空??
- webview加载页面为什么不用另开一个线程?
- android4.4是否可以接管系统的来去电界面
- android如何在软件盘没出现的情况下获取它的高度
- 照搬网上的代码,可程序就是意外终止,请前辈指点一二,谢谢。。。
- 怎样在activity中响应view类中的触屏事件?
使用wchar 统一2字节封装后给jstring
不要str = (*env)->NewStringUTF(env,string);
这只有在英文纯ASCII码才适用
晚上都是用的windows.h里带的转码函数,但是我认为比较麻烦,而且如果参数传错了可能就直接挂JNI里了,调试非常麻烦,所以我还是建议我上面说的那种方式,比较安全。
{ //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;
}
dinjay说的不错,给的例子只适用于WIN。但传字节的思路还是对的把编码处理,交给JAVA来做。