使用JNI时出现实例和类变量状态问题
Issue with instance and class variable states when using JNI
我目前正在编写一些使用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);
相关文章:
- 查找后更改类变量
- 如何避免在仅标头库中C++类/变量重定义
- c++ 在非类函数中使用类变量
- 基于模板的类变量
- 分段 访问私有类变量时出错
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 模板类变量作为非模板类的成员
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- 如何在构造函数中访问类变量以分配它们,而无需在C++中使用此指针
- 类变量无法从类方法访问
- 指针作为类变量 Qt
- 为什么线程对类变量所做的更改没有影响?
- memcpy() 在一个类中被调用以复制到另一个类变量中后会引发异常
- C++:使用基类中的仅派生类变量
- 从静态成员函数访问私有非静态类变量 - C++
- 如何在单例类中管理变量状态?
- 静态类变量的多重定义
- C++在保存受用户输入影响的变量的状态时使用临时变量或类变量
- 使用JNI时出现实例和类变量状态问题