JNI中string 、 char* 和 jstring 两种转换

10 篇文章 0 订阅
1 篇文章 0 订阅

亲测有效

jstring 转 c char 数组 

// java中的jstring, 转化为c的一个字符数组  
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr,jsize *alen)  
{  
     char*   rtn   =   NULL;  
     jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");  
     jstring   strencode   =   (*env)->NewStringUTF(env,"UTF-8");  //GB2312
     jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B");  
     jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");  
     *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]; "\0"  
      memcpy(rtn,ba,*alen);  
      rtn[*alen]=0;  
     }  
     (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //释放内存  
  
     return rtn;  
}   


c char 数组转   jstring

// 由于jvm和c++对中文的编码不一样,因此需要转码。gb2312转换成utf8/16
jstring charTojstring(JNIEnv* env, const char* pat) {
    //定义java String类 strClass
    jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
    //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
    jmethodID ctorID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V");
    //建立byte数组
    jbyteArray bytes = (*env)->NewByteArray(env,strlen(pat));
    //将char* 转换为byte数组
    (*env)->SetByteArrayRegion(env,bytes, 0, strlen(pat), (jbyte*) pat);
    // 设置String, 保存语言类型,用于byte数组转换至String时的参数
    jstring encoding = (*env)->NewStringUTF(env,"GB2312");//GB2312
    //将byte数组转换为java String,并输出
    return (jstring) (*env)->NewObject(env,strClass, ctorID, bytes, encoding);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值