2

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

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

我的代码如下所示:

爪哇:

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 类的引用,我不知道我要传递什么项目。

4

1 回答 1

4

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

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

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

于 2013-09-19T11:31:19.530 回答