c++ 中的 JNI CallIntMethod 返回错误值

Posted

技术标签:

【中文标题】c++ 中的 JNI CallIntMethod 返回错误值【英文标题】:JNI CallIntMethod from c++ returns wrong value 【发布时间】:2013-09-19 11:24:15 【问题描述】:

我使用 JNI 在我的(古老的,VC6)MFC 应用程序中嵌入一些 Java 面板。当我为 Java 类中的某些测试方法调用 CallIntMethod 时,我没有得到预期的值。

也许一个类似的问题是this,但是我的问题没有解决方案,所以我问了一个新问题。

我的代码如下:

JAVA:

public int int_test()

    return 22;

C++:

jmethodID testmethod = env->GetMethodID(clsBean, "int_test", "()I");
if (testmethod)

    // this one gets me some random number
    jint val = env->CallIntMethod(clsBean, testmethod);
    int a = (int)val; 

编辑(关于 mkaes 的回答):

这个

jint val = env->CallIntMethod(clsBean, testmethod);

调用jni.h中声明的这个方法:

jint CallIntMethod(jobject obj, jmethodID methodID, ...) 
    va_list args;
    jint result;
    va_start(args,methodID);
    result = functions->CallIntMethodV(this,obj,methodID,args);
    va_end(args);
    return result;

最后调用了这个:

jint (JNICALL *CallIntMethodV)
  (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);

所以我认为这个 jobject obj 是我对 Java 类的引用,而 jmethodID methodID 是对要调用的函数的引用。抱歉,如果不是对 Java 类的引用,我不知道我要传递什么项目。

【问题讨论】:

CallIntMethod result -1 - android JNI的可能重复 我已经阅读了这个问题,但提供的答案没有帮助:( 【参考方案1】:

你没有为你的类使用对象。

jmethodID testmethod = env->GetMethodID(clsBean, "int_test", "()I");clsBean 是类 ID。

jint val = env->CallIntMethod(clsBean, testmethod); 第二个参数需要是您调用此方法的对象。除非您将方法更改为静态。 然后你可以使用CallStaticIntMethod

【讨论】:

谢谢,明白了! GetMethodID 从类中获取方法,然后您可以在该类的 INSTANCE 上调用 CallIntMethod。非常感谢提示

以上是关于c++ 中的 JNI CallIntMethod 返回错误值的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的JNI将文件读取到jbyteArray

C ++中的JNI将文件读取到jbyteArray

通过从 qt 中的 c++ JNI 发送字符串在 Android 中显示 Toast

JNI - C++/Java 中的侦听器 - 是不是可以在 C++ 中实例化 Java 对象并将它们用作参数

如何把c++中的unsigned char* mData的数据指针通过jni把数据传给java使用?

如何通过JNI将java中的对象的地址赋值给c++指针变量