我遇到了在Linux中不同线程之间共享绑定到JNI库的对象的问题,我试图理解为什么会导致它以及导致它的原因?
以下是该方案:
我有一个第三方(让我们称之为LIB)用C语言编写的用于Windows和Linux的库(我无法访问源代码,但我们假设为了这个目的,该库的一切正常讨论)
我创建了一个JNI包装器,它公开了一组从Java调用的方法,然后这些方法从LIB调用函数
有一个Java对象(我们称之为OBJ)加载JNI包装器并调用其函数
我在Java Application中有2个线程T1和T2,我在T1中实例化OBJ,调用它上面的一些函数(在后面调用调用LIB的JNI包装器)。我正在将OBJ传递给T2,现在在Windows上一切正常工作 - OBJ,JNI包装器和LIB保持其状态,但在LINUX中OBJ保持其状态,但似乎LIB没有。
为了更清楚,让我们说LIB有两个功能:setValue(a)
和getValue(a)
,如果我在T1中调用setValue(1)
然后在T2调用getValue()
,则在Windows中(当然通过OBJ和JNI)我将得到值1,在LINUX中我得到垃圾,好像状态/ LIB实例丢失了。
线程是同步的,即有一种机制可以确保T2在T1初始化OBJ之前和T1调用OBJ期间不会对OBJ进行任何调用,例如:
OBJ driver = new OBJ();
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
synchronized(driver) {
driver.setValue(99);
}
}
});
Thread t2 = new Thread(new Runnable(){
@Override
public void run() {
synchronized(driver) {
System.out.println("Value : " + driver.getValue());
}
}
});
t1.start();
t1.join();
t2.start();
t2.join();
LIB的LINUX版本中可能存在一个错误,但假设没有,我在这里缺少一些关于JNI,Java,进程/线程在Linux和Windows中工作的方法,可以解释这种行为?