我目前正在编写一些使用JNI的Android代码,并且在类和实例变量的工作方式上遇到困难。如果我执行以下代码,则希望代码打印出“18”的值,但我始终会收到“0”的值。有人可以解释我在做什么错吗?
// Java代码
SampleClass sc = new SampleClass(18);
sc.printId() // returns 18, as expected
sc.nativePrintId() // returns 0, why?!
// Java类
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?
}
最佳答案
您必须将对象(而不是类)传递给CallVoidMethod
。
使用:
env->CallVoidMethod(thiz, printId);
另外,您应该从对象而不是
FindClass
获取类。使用:
jclass clazz = env->GetObjectClass(thiz);