Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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); }

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 =

如何获取字符串并将其转换为常量字符*

我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。

根据,最后一个参数是指向
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;