gpt4 book ai didi

java - JNI 方法返回旧数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:32 26 4
gpt4 key购买 nike

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

这是简化的代码

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 0Java 1Java 1Java 1

在控制台中:000JNI 1

因此,JNI 在某种程度上落后于变量的真实状态。它在应用程序中产生了一个重要的错误 (((

可能是java本身的问题? (v.1.5,我被迫使用它)

非常感谢任何帮助。

最佳答案

我建议使用一种语言或另一种语言进行所有同步。由于某种原因,看起来“volatile”在边界上没有受到尊重。像这样的东西:

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

关于java - JNI 方法返回旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com