JNI字符串返回值 我有一个java实例方法,它返回一个字符串,我通过C++中的JNI调用这个方法。我编写了以下代码: const char *DiagLayerContainer_getDESC(JNIEnv *env, jobject diagLayer) { jclass diagLayerClass = env->FindClass(PARSER_CLASS); jmethodID getDESCDiagLayerMethodID = env->GetMethodID(diagLayerClass, "getDESCDiagLayer", "(Ljava/lang/Object;)Ljava/lang/String;"); jstring returnString = (jstring) env->CallObjectMethod(diagLayer, getDESCDiagLayerMethodID); return env->GetStringUTFChars(returnString, JNI_FALSE); }
如何获取字符串并将其转换为常量字符* 我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。根据,最后一个参数是指向JNI字符串返回值 我有一个java实例方法,它返回一个字符串,我通过C++中的JNI调用这个方法。我编写了以下代码: const char *DiagLayerContainer_getDESC(JNIEnv *env, jobject diagLayer) { jclass diagLayerClass = env->FindClass(PARSER_CLASS); jmethodID getDESCDiagLayerMethodID = env->GetMethodID(diagLayerClass, "getDESCDiagLayer", "(Ljava/lang/Object;)Ljava/lang/String;"); jstring returnString = (jstring) env->CallObjectMethod(diagLayer, getDESCDiagLayerMethodID); return env->GetStringUTFChars(returnString, JNI_FALSE); },java,c++,string,java-native-interface,Java,C++,String,Java Native Interface,如何获取字符串并将其转换为常量字符* 我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。根据,最后一个参数是指向jboolean的指针 改变 return env->GetStringUTFChars(returnString, JNI_FALSE); 到 或者最好返回一个std::string std::string DiagLayerContainer_getDESC(...) { ... const char *js =
jboolean
的指针
改变
return env->GetStringUTFChars(returnString, JNI_FALSE);
到
或者最好返回一个std::string
std::string DiagLayerContainer_getDESC(...) {
...
const char *js = env->GetStringUTFChars(returnString, NULL);
std::string cs(js);
env->ReleaseStringUTFChars(returnString, js);
return cs;
}
我已经构建了一个类似的简单示例,目前为止,代码还不错
但是,有两个可能的错误源
第一个是方法签名。尝试使用“()Ljava/lang/String;”
代替“(Ljava/lang/Object;)Ljava/lang/String;”
第二个是java源代码本身。如果java方法返回空字符串,CallObjectMethod()
将返回空jstring
并且GetStringUTFChars()
失败
添加
if (returnString == NULL)
return NULL;
在CallObjectMethod()之后
因此,查看java源代码,看看方法
getDescDiagrayer()
是否会返回空字符串。在调试器中运行代码,并在崩溃点检查进程的状态。它在这里崩溃(jni.h):const char*GetStringUTFChars(jstring str,jboolean*isCopy){return functions->GetStringUTFChars(this,str,isCopy);}如果isCopy
为false且returnString
超出范围(即通过显式或隐式PopLocalFrame
),则将有一个悬空指针返回GetStringUTFChars
的结果,然后调用ReleaseStringUTFChars
。稍后,像在本机代码中一样,使用free()
处理副本。strdup()替换为std::string(),它将复制新分配的字符串本身。如何在Logcat中打印returnString?Logcat是什么意思?Android的Logcat?
if (returnString == NULL)
return NULL;