JNI里面处理 C和java字符串互相转换

来源:互联网 发布:win7端口在哪里打开 编辑:程序博客网 时间:2024/05/18 15:30
/*    将 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);}
原创粉丝点击