java - 如何在 JNI 中访问从 C++ 返回 java.lang.String 的 Java 方法的返回值?

标签 java c++ java-native-interface

我正在尝试从 C++ 调用的 Java 方法传回一个字符串。我无法找出应该调用什么 JNI 函数来访问该方法并返回一个 jstring 值。

我的代码如下:

C++ 部分

main() {
    jclass cls;
    jmethodID mid;
    jstring rv;

/** ... omitted code ... */

    cls = env->FindClass("ClassifierWrapper");
    mid = env->GetMethodID(cls, "getString","()Ljava/lang/String");

    rv = env->CallStatic<TYPE>Method(cls, mid, 0);
    const char *strReturn = env->GetStringUTFChars(env, rv, 0);

    env->ReleaseStringUTFChars(rv, strReturn);
}

Java 代码

public class ClassifierWrapper {
    public String getString() { return "TEST";}
}

方法签名(来自“javap -s Class”)

public java.lang.String getString();
  Signature: ()Ljava/lang/String;

最佳答案

你应该有

cls = env->FindClass("ClassifierWrapper"); 

然后你需要调用构造函数来获取一个新的对象:

jmethodID classifierConstructor = env->GetMethodID(cls,"<init>", "()V"); 
if (classifierConstructor == NULL) {
  return NULL; /* exception thrown */
}

jobject classifierObj = env->NewObject( cls, classifierConstructor);

您正在获取静态方法(即使方法名称错误)。但是您需要获取实例方法,因为 getString() 不是静态的。

jmethodID getStringMethod = env->GetMethodID(cls, "getString", "()Ljava/lang/String;"); 

现在调用方法:

rv = env->CallObjectMethod(classifierObj, getStringMethod, 0); 
const char *strReturn = env->GetStringUTFChars(env, rv, 0);

关于java - 如何在 JNI 中访问从 C++ 返回 java.lang.String 的 Java 方法的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30509332/

相关文章:

android - 安卓 Jni 教程

android - 如何在 Google Play 中分发 ARCH 的 apk?

需要 C++ Unicode 加密库(或者是?)

java - 从 Java 和 Python 调用 native 库时如何释放内存?

java - mongodb套接字中的java.lang.Throwable错误是什么意思?

java - 从不使用 spring ldap 设置 tls_reqcert

java - 直接 self 引用导致循环 Ebean 和 Jackson

java - 从库中识别新类型

C++ 单个字符未通过套接字发送

c++ - 转换运算符如何返回值?