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

Issue with instance and class variable states when using JNI

本文关键字:类变量 状态 问题 实例 JNI 使用      更新时间:2023-10-16

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