我目前正在编写一些使用JNI的Android代码,而我在类和实例变量的工作方式上遇到了困难。如果我执行以下代码,我希望代码打印值“18”,但我总是收到值“0”。有人可以解释我做错了吗?
// Java代码
SampleClass sc = new SampleClass(18);
sc.printId() // returns 18, as expected
sc.nativePrintId() // returns 0, why?!
// Java Class
public class SampleClass
{
private int mId = -1;
public FFmpegMediaPlayer(int id) {
mId = id;
}
public void printId() {
System.out.println("id: " + mId);
}
public native void nativePrintId();
}
// JNI C ++代码
static void nativePrintId(JNIEnv* env, jobject thiz)
{
jclass clazz = env->FindClass("wseemann/media/SampleClass");
jmethodID printId = env->GetMethodID(clazz, "printId", "()V");
env->CallVoidMethod(clazz, printId); // always prints zero?
}
答案 0 :(得分:2)
您必须将对象而不是类传递给CallVoidMethod
。
使用:
env->CallVoidMethod(thiz, printId);
此外,您应该从对象获取类,而不是从FindClass
。
使用:
jclass clazz = env->GetObjectClass(thiz);