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

Jua*_*cek 4 c++ java 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);
}
Run Code Online (Sandbox Code Playgroud)

Java代码

public class ClassifierWrapper {
    public String getString() { return "TEST";}
}
Run Code Online (Sandbox Code Playgroud)

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

public java.lang.String getString();
  Signature: ()Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)

Mar*_*amy 8

你应该有

cls = env->FindClass("ClassifierWrapper"); 
Run Code Online (Sandbox Code Playgroud)

然后,您需要调用构造函数来获取新对象:

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

jobject classifierObj = env->NewObject( cls, classifierConstructor);
Run Code Online (Sandbox Code Playgroud)

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

jmethodID getStringMethod = env->GetMethodID(cls, "getString", "()Ljava/lang/String"); 
Run Code Online (Sandbox Code Playgroud)

现在调用方法:

rv = env->CallObjectMethod(classifierObj, getStringMethod, 0); 
const char *strReturn = env->GetStringUTFChars(env, rv, 0);
Run Code Online (Sandbox Code Playgroud)

  • 班级名称应以; 喜欢:()Ljava/lang/String; (3认同)

cah*_*yaz 5

完整的工作解决方案如下:

Java端

public class ClassifierWrapper {
public ClassifierWrapper(){}
public String getString() { return "TEST";}
}
Run Code Online (Sandbox Code Playgroud)

本机端

jclass cls;
jmethodID mid;
jstring rv;


cls = jniEnv->FindClass("ClassifierWrapper"); //plase also consider your package name as package\name\classname

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

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

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


jniEnv->ReleaseStringUTFChars(rv, strReturn);
Run Code Online (Sandbox Code Playgroud)