char* 轉jstring的函數時,在android平臺運行後報錯如下:
char* 轉jstring:
jstring CStr2Jstring( JNIEnv* env, const char* pat )
{
//定義java String類 strClass
jclass strClass = (env)->FindClass("java/lang/String");
//獲取java String類方法String(byte[],String)的構造器,用於將本地byte[]數組轉換爲一個新String
jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
//建立byte數組
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
//將char* 轉換爲byte數組
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//設置String, 保存語言類型,用於byte數組轉換至String時的參數
jstring encoding = (env)->NewStringUTF("GB2312");
//將byte數組轉換爲java String,並輸出
return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}
jstring chars2Jstring( JNIEnv* env, const char* pat )
{
//定義java String類 strClass
JniMethodInfo class_init;
//獲取類的構造函數
if (JniHelper::getMethodInfo(class_init,"java/lang/String","<init>","([BLjava/lang/String;)V") == false)
{
CCLog("JniHelper::FindClass failed");
return nullptr;
}
//建立byte數組
jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
//將char* 轉換爲byte數組
(env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
//設置String, 保存語言類型,用於byte數組轉換至String時的參數
jstring encoding = (env)->NewStringUTF("GB2312");
//將byte數組轉換爲java String,並輸出
return (jstring)(env)->NewObject(class_init.classID, class_init.methodID, bytes, encoding);
}
jstring轉char*:
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
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;
}