3.5 String转字符串的另一种
由于在Java中采用宽字符数组来表示字符串,而宽字符在C++中支持并不是很好(C++习惯\0表示结束,而宽字符可能有许多位置都是0),所以当两个语言通过jni调用时,如果需要传递字符串参数,那么必须要通过转换才可以。
string BCJ2C(JNIEnv* env, jstring jstr)
{
char* ret = NULL;
jclass JStrClass = env->FindClass("java/lang/String");
jstring Codec = env->NewStringUTF("utf-8");
jmethodID getBytes = env->GetMethodID(JStrClass, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray JBytes = (jbyteArray)env->CallObjectMethod(jstr, getBytes, Codec);
jsize byteLen = env->GetArrayLength(JBytes);
jbyte* JBuffer = env->GetByteArrayElements(JBytes, JNI_FALSE);
if (byteLen > 0)
{
ret = (char*)malloc(byteLen + 1);
memcpy(ret, JBuffer, byteLen);
ret[byteLen] = 0;
}
env->ReleaseByteArrayElements(JBytes, JBuffer, 0);
if(ret) {
string tmp(ret);
free(ret);
return string(ret);
}
return string();
}
jstring BCC2J(JNIEnv* env, string str)
{
env->NewStringUTF(str.c_str());
}