/* 将 String 类型转成 char* */ char* Jstring2CStr(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = (*env)->FindClass(env,"java/lang/String"); jstring strencode = (*env)->NewStringUTF(env,"GB2312"); jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); jsize alen = (*env)->GetArrayLength(env,barr); jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE); if(alen > 0) { rtn = (char*)malloc(alen+1); //new char[alen+1]; memcpy(rtn,ba,alen); rtn[alen]=0; } (*env)->ReleaseByteArrayElements(env,barr,ba,0); return rtn; } /** 将char* 转成 其他类型 */ jstring CStr2Jstring( JNIEnv* env, const char* pat ) { //定义java String类 strClass jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;"); //获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String jmethodID ctorID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V"); //建立byte数组 jbyteArray bytes = (*env)->NewByteArray(env,(jsize)strlen(pat)); //将char* 转换为byte数组 (*env)->SetByteArrayRegion(env,bytes, 0, (jsize)strlen(pat), (jbyte*)pat); //设置String, 保存语言类型,用于byte数组转换至String时的参数 jstring encoding = (*env)->NewStringUTF(env,"GB2312"); //将byte数组转换为java String,并输出 return (jstring)(*env)->NewObject(env,strClass, ctorID, bytes, encoding); }
JNI里面处理 C和java字符串互相转换
最新推荐文章于 2022-10-14 19:45:54 发布