Метод JNI возвращает старые данные - PullRequest
2 голосов
/ 15 июля 2010

Я потратил целый день на эту проблему и до сих пор не знаю, как ее решить.

Вот упрощенный код

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 &lt&lt "JNI " &lt&lt wrapper::isTerminated() &lt&lt "\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 &lt _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, я вынужден был использовать его)

Любая помощь очень ценится.

1 Ответ

1 голос
/ 21 июля 2010

Я бы предложил выполнить всю синхронизацию на одном языке или на другом.Похоже, что «изменчивый» не уважают за границей по какой-то причине.Что-то вроде:

public doJob()
{
  while(!isTerminated)
    executeNative();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...