从JNI在Android上调用非静态方法

时间:2011-10-04 06:00:24

标签: android java-native-interface android-ndk

我想使用JNI在Android上调用非静态方法。我可以使用CallStaticVoidMethod调用静态方法。要调用非静态方法,我使用了CallVoidMethod。它不起作用。

有人可以告诉我从JNI调用Android的非静态方法的正确代码吗?

jmethodID method = env->GetMethodID(gJniRefCached.ImsFwkLoaderClass, "DispVideo", "([BII)V");

env-> CallVoidMethod(gJniRefCached.ImsFwkLoaderClass,method,arr,width,height);

我也尝试过使用代码类的对象 jclass cls = env->GetObjectClass(obj); jmethodID method = env->GetMethodID(cls, "DispVideo", "([BII)V"); env->CallVoidMethod(cls, method,arr,width,height);

1 个答案:

答案 0 :(得分:9)

为了调用实例方法,您需要提供方法所属的类的实例,表示为jobject。但是,在这两个示例中,您都尝试使用类定义的实例调用实例方法,表示为jclass

尝试以下方法:

jclass cls = env->GetObjectClass(obj);
jmethodID method = env->GetMethodID(cls, "DispVideo", "([BII)V");
env->CallVoidMethod(obj, method, arr, width, height);

请注意第三行代码中的细微差别,我使用obj作为第一个参数,而不是cls

您还可以在文档页面上看到实例方法JNI函数的这种差异:http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#wp16656

同时查看GetMethodIDCall<type>Method - 一个需要jclass,另一个需要jobject