所以我有这个场景:
有一个Java类让我们称它为OBJ,通过JNI通过C包装器(WRAP)调用C库(LIB)上的一些方法。 我只能访问OBJ和WRAP源代码,我不知道LIB中有什么,我只知道它暴露了一些由te包装器(WRAP)调用的方法,它通过OBJ中的JNI调用。
在线程之间共享OBJ时,我遇到了非常奇怪的行为,这是一个例子:
OBJ obj = null;
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
obj = new OBJ();
}
});
t1.start();
t1.join();
System.out.println("Value from main thread: " + obj.getValue());
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Value from t2 thread: " + obj.getValue());
}
});
t2.start();
t2.join();
运行上面的代码时,第一个System.out.println()
返回不正确的值,而第二个System.out.println()
打印正确的值。
obj.getValue()在包装器上调用本机方法(getValueC),包装器从库(LIB)调用方法。
如上所述,我无法访问LIB,但我首先要确保我的思路没有任何问题,线程t1,t2和主线程之间有什么区别吗?
令人惊讶的是,如果我在主线程中实例化对象,那么t1和t2都将打印正确的值。
是否可能需要在主线程中实例化JNI绑定对象?