当前位置: 首页 > 知识库问答 >
问题:

JNI字符串返回值

祝昊东
2023-03-14

我有一个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。

共有1个答案

何禄
2023-03-14

根据GetStringUTFChars,最后一个参数是指向jboolean的指针。

改变

return env->GetStringUTFChars(returnString, JNI_FALSE);

return env->GetStringUTFChars(returnString, NULL);

或者最好返回一个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()将返回NULLjstringGetStringUTFChars()失败。

添加

if (returnString == NULL)
    return NULL;

在调用对象方法()之后。

因此,请查看java源代码并查看方法getDESCDiagLayer()是否可能返回空字符串

 类似资料:
  • 我有一个Java实例方法,它返回一个字符串,我通过C中的JNI调用这个方法。我编写了以下代码: 如何获取字符串并将其转换为常量字符*? 我的程序在最后一行崩溃,访问冲突为0x00000000。returnString不为NULL。

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f

  • 我很难在我的android应用程序中处理编辑文本的输入。我正在输入小数点值,我已经处理了小数点,但是当我移除EditText的所有内容时,我的应用程序崩溃了。我在EditText小部件的onTextChanged函数中检查了NULL或“”的值,但是这个值被超越了。以下是我的相关功能: 我的logcat: 我担心的是我被告知无效的双倍是“”,然而我正在检查这样的事件... 谢谢你的帮助!

  • 在我的程序中,C是从Java调用的,C函数可以在Java上下文之外调用,但有时需要一些Java资源。我应该解释一下程序是什么。。。因此C库是一个插件系统,可以加载C插件,插件有时需要访问Java资源,例如检索字符串id。 因此,当加载插件系统时,JNI会调用一个init函数,以便可以存储和以供插件进一步访问。 在java类中,我提供了实例方法来访问这些资源,例如,我有方法 C插件系统有一个功能 其

  • 问题内容: 我创建了一个Web服务,该服务返回。这必须能够返回工作正常的。但它也应该能够返回。知道如何使用来传送A 吗? 问题答案: JavaMail具有一个可用于此目的的: mime类型中的in决定它将字符串转换为字节时使用的编码方式。