JNI unsigned char*转jstring 与 jst

2020-11-12  本文已影响0人  仍旧热忱_3619
  1. unsigned char* 转jstring
/**
 * unsigned char 转成 jstring 类型
 * @param e
 * @param pJobject
 * @param pChar
 * @return
 */
jstring unsigchar2jstring(JNIEnv *e, unsigned char* pChar){
    unsigned char *newresult = pChar;
    //定义java String类 clsstring
    jclass clsstring = e->FindClass("java/lang/String");
    //获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
    jmethodID mid = e->GetMethodID(clsstring , "<init>" , "([BLjava/lang/String;)V");
    // 设置String, 保存语言类型,用于byte数组转换至String时的参数
    jstring encoding = e->NewStringUTF("GB2312");
    //建立byte数组
    jbyteArray bytes = e->NewByteArray(strlen((char*)newresult));
    //将char* 转换为byte数组
    e->SetByteArrayRegion(bytes, 0, strlen((char*)newresult), (jbyte*) newresult);
    //将byte数组转换为java String,并输出
    return (jstring) e->NewObject(clsstring, mid, bytes, encoding);
}
  1. jstring转unsigned char*
/**
 * jstring转成 unsigned char * 类型
 * @param e
 * @param pJobject
 * @param pJstring
 * @return
 */
unsigned char *jstring_2unsigchar(JNIEnv *e, jstring pJstring) {
    char* rtn = NULL;
    jclass clsstring = e->FindClass("java/lang/String");
    jstring strencode = e->NewStringUTF("GB2312");
    jmethodID mid = e->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray) e->CallObjectMethod(pJstring, mid, strencode);
    jsize alen = e->GetArrayLength(barr);
    jbyte* ba = e->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0) {
        rtn = (char*) malloc(alen + 1);
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    e->ReleaseByteArrayElements(barr, ba, 0);
    return reinterpret_cast<unsigned char *>(rtn);
}
上一篇 下一篇

猜你喜欢

热点阅读