来自c ++的JNI CallIntMethod返回错误的值

时间:2013-09-19 11:24:15

标签: java c++ java-native-interface

我正在使用JNI在我的(古代,VC6)MFC应用程序中嵌入一些Java-Panel。当我在Java-Class中为某些testmethod调用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-Class的引用, jmethodID methodID 是对要调用的函数的引用。抱歉,但如果没有引用Java-Class,我就不会得到我要传递的作业。

1 个答案:

答案 0 :(得分:4)

您不要为您的班级使用对象。

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

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