JNI中string char jstring两种转换

Posted 老樊Lu码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI中string char jstring两种转换相关的知识,希望对你有一定的参考价值。

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

1、char* 和 jstring 第一种互相转换写法(使用的是MinGW头文件):

char* jstringToChar(JNIEnv *env, jstring jstr) {

int length = (env)->GetStringLength(jstr);

const jchar* jcstr = (env)->GetStringChars(jstr, 0);

char* rtn = (char*) malloc(length * 2 + 1);

int size = 0;

size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR) jcstr, length, rtn,

(length * 2 + 1), NULL, NULL);

if (size <= 0)

return NULL;

(env)->ReleaseStringChars(jstr, jcstr);

rtn[size] = 0;

return rtn;

}

// 由于jvm和c++对中文的编码不一样,因此需要转码。gb2312转换成utf8/16

jstring charTojstring(JNIEnv* env, const char* str) {

jstring rtn = 0;

int slen = strlen(str);

unsigned short * buffer = 0;

if (slen == 0)

rtn = (env)->NewStringUTF(str);

else {

int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR) str, slen, NULL, 0);

buffer = (unsigned short *) malloc(length * 2 + 1);

if (MultiByteToWideChar( CP_ACP, 0, (LPCSTR) str, slen, (LPWSTR) buffer, length) > 0)

rtn = (env)->NewString((jchar*) buffer, length);

// 释放内存

free(buffer);

}

return rtn;

}

2、char* 和 jstring 第二种互相转换写法:

jstring charTojstring(JNIEnv* env, const char* pat) {

//定义java String类 strClass

jclass strClass = (env)->FindClass("Ljava/lang/String;");

//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String

jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");

//建立byte数组

jbyteArray bytes = (env)->NewByteArray(strlen(pat));

//将char* 转换为byte数组

(env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*) pat);

// 设置String, 保存语言类型,用于byte数组转换至String时的参数

jstring encoding = (env)->NewStringUTF("GB2312");

//将byte数组转换为java String,并输出

return (jstring) (env)->NewObject(strClass, ctorID, bytes, encoding);

}

char* jstringToChar(JNIEnv* env, jstring jstr) {

char* rtn = NULL;

jclass clsstring = env->FindClass("java/lang/String");

jstring strencode = env->NewStringUTF("GB2312");

jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);

jsize alen = env->GetArrayLength(barr);

jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);

if (alen > 0) {

rtn = (char*) malloc(alen + 1);

memcpy(rtn, ba, alen);

rtn[alen] = 0;

}

env->ReleaseByteArrayElements(barr, ba, 0);

return rtn;

}

3、string 和 jstring 互相转换:

string 转换成 jstring :通常是将 string 转换成 char*, 然后在再将char*转换成jstring, 示例:

std::string str = "abc";

// string 转 char*

char* chardata = str.c_str();

// char* 转 string

jstring jstr = charTojstring(env, chardata);

jstring 转换成 string :通常是将 jstring 转换成 char*, 然后在再将char*转换成 string, 示例:

// jstring 转 char*

char* chardata = jstringToChar(env, jstr);

// char* 转 string

std::string str = charData;

以上是关于JNI中string char jstring两种转换的主要内容,如果未能解决你的问题,请参考以下文章

JAVA/JNI的jstring转换为char*

JNI程序中的jstring返回

jni 字符串的梳理 2 字符串的处理操作

c用法中的jstring到char *未转换为可打印格式

怎么把jstring转换成char

JNI NewStringUTF报错解决方案