使用JNI时出现实例和类变量状态

时间:2013-12-07 02:07:06

标签: android c++ java-native-interface

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

1 个答案:

答案 0 :(得分:2)

您必须将对象而不是类传递给CallVoidMethod

使用:

env->CallVoidMethod(thiz, printId);

此外,您应该从对象获取类,而不是从FindClass

使用:

jclass clazz = env->GetObjectClass(thiz);