您的位置:首页 > Web前端 > JavaScript

NDK开发jstring和Cstring转换工具方法(实践有效)

2016-12-01 22:55 405 查看
/**

利用Java的String类来完成字符编码转换

*/

char*  Jstring2CStr(JNIEnv*  env,jstring  jstr)
{
LOGI("enter CStr2Jstring 1");
char*   rtn   =   NULL;
jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
jstring   strencode   =  (*env)->NewStringUTF(env,"GB2312");//转换成Cstring的GB2312,兼容ISO8859-1
//jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);第二个参数是方法名,第三个参数是getBytes方法签名
//获得签名:javap -s java/lang/String:   (Ljava/lang/String;)[B
jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,"getBytes","(Ljava/lang/String;)[B");
//等价于调用这个方法String.getByte("GB2312");
//将jstring转换成字节数组
LOGI("enter CStr2Jstring 2");
//用Java的String类getByte方法将jstring转换为Cstring的字节数组
jbyteArray  barr=   (jbyteArray) (*env)->CallObjectMethod(env,jstr,mid,strencode);
LOGI("enter CStr2Jstring 3");
jsize   alen   =   (*env)->GetArrayLength(env,barr);
LOGI("enter CStr2Jstring 4");
jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
LOGI("alen=%d\n",alen);
if(alen   >   0)
{
rtn   =   (char*)malloc(alen+1+128);
LOGI("rtn address == %p",&rtn);//输出rtn地址
memcpy(rtn,ba,alen);
rtn[alen]=0;            //"\0"
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0);
return rtn;
}

/**
* C的字符串转jstring的字符串
*/
jstring CStr2Jstring( JNIEnv* env, const char* pat)
{

jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
jmethodID mID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (*env)->NewByteArray(env,(jsize)strlen(pat));
(*env)->SetByteArrayRegion(env,bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //将char* 转换为byte数组
jstring encoding = (*env)->NewStringUTF(env,"GB2312");
return (jstring)(*env)->NewObject(env,strClass, mID, bytes, encoding);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: