如何访问返回Java的Java方法的返回值。来自JNI中C++的字符串?

 2023-01-20    286  

问题描述

我试图从C ++的Java方法中传递一个字符串.我无法找出我应该打电话给访问该方法的JNI功能并返回JSTRing值的功能.

我的代码如下:

如何访问返回Java的Java方法的返回值。来自JNI中C++的字符串?

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类”)

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 side

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

本地侧

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

其他推荐答案

签名()Ljava/lang/String是错误的,因此必须使用;终止的类名称,在这种情况下,签名必须为()Ljava/lang/String;

以上所述是小编给大家介绍的如何访问返回Java的Java方法的返回值。来自JNI中C++的字符串?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26138.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。