我整天都在解决这个问题,但仍然不知道如何解决。

这是简化的代码

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本身有问题? (v.1.5,我被迫使用)

任何帮助是极大的赞赏。

最佳答案

我建议用一种或另一种语言进行所有同步。出于某种原因,似乎似乎没有跨边界尊重“ Volatile ”。就像是:

public doJob()
{
  while(!isTerminated)
    executeNative();
}

09-27 17:38