我整天都在解决这个问题,但仍然不知道如何解决。
这是简化的代码
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();
}