JNI方法返回旧数据

时间:2010-07-15 15:28:36

标签: java c++ java-native-interface

我花了一整天时间来解决这个问题,但仍然不知道如何解决它。

这是简化代码

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节,我被迫使用它)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我建议用一种语言或另一种语言进行所有同步。由于某种原因,看起来“挥发性”并未受到跨界的尊重。类似的东西:

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