Я потратил целый день на эту проблему и до сих пор не знаю, как ее решить.
Вот упрощенный код
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 ++ ловит isTermination ().
В выводе я вижу:
....
....
в журнале:
Ява 0
Ява 1
Ява 1
Ява 1
в консоли:
JNI 0
JNI 0
JNI 0
JNI 1
Итак, JNI как-то отстает от реального состояния переменной.
Выдает важную ошибку в приложении (((
Может быть, это какая-то проблема с самой Java? (v.1.5, я вынужден был использовать его)
Любая помощь очень ценится.