我花了一整天时间来解决这个问题,但仍然不知道如何解决它。
这是简化代码
JAVA
class javaclass{
private volatile boolean isTerminated;
public void javamethod()
{
log.logInfo("java :"+isTerminated());
}
public int isTerminated()
{
return (isTerminated) ? 1 : 0;
}
public doJob()
{
executeNative();
}
private native int executeNative() throws Exception;
}
C ++
bool cmethod()
{
cerr << "JNI " << wrapper::isTerminated() << "\n";
if(wrapper::isTerminated)
return false;
jni->CallVoidMethod(self, apiJavamethod, xPoint);
return true;
//apiJavamethod is jMethodId of javamethod
}
int wrapper::isTerminated()
{
return jni->CallIntMethod(self, apiIsTerminated);
}
JNIEXPORT jint JNICALL NAMESPACE_javaclass_executeNative(JNIEnv* env, jobject self) {
for(int i=0;i < _ITERATIONS;++i)
{
if(!cmethod())
break;
}
}
C ++ cmethod在某个循环中执行,当C ++捕获isTerminated()时停止。 在输出中我看到:
.... ....
日志中的: java 0 java 1 java 1 java 1
在控制台中: JNI 0 JNI 0 JNI 0 JNI 1
所以,JNI在某种程度上落后于变量的真实状态。 它在应用程序中产生了一个重要的错误((
也许这是java本身的一些问题? (第1.5节,我被迫使用它)
非常感谢任何帮助。
答案 0 :(得分:1)
我建议用一种语言或另一种语言进行所有同步。由于某种原因,看起来“挥发性”并未受到跨界的尊重。类似的东西:
public doJob()
{
while(!isTerminated)
executeNative();
}