我正在尝试从 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/