我目前正在编写一些使用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);

08-24 17:59