我想使用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);
答案 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
同时查看GetMethodID
和Call<type>Method
- 一个需要jclass
,另一个需要jobject
。