C ++代码中的JNI全局静态变量

时间:2010-12-22 10:26:56

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

我从多线程java应用程序中调用了JNI C ++代码

这个C ++代码有2个全局静态变量,一个布尔值和一个字符串。

由于某种原因,我不断从此代码中获得分段错误。知道是什么导致了这个吗?我知道这不是线程安全的,但我将变量视为只读java应用程序,只有C ++代码才能修改这些变量的值

非常感谢

编辑:此代码在Linux机器上运行。并且一次运行几个月没有任何问题,然后它发出信号11分段故障和JVM崩溃。

1 个答案:

答案 0 :(得分:5)

如果您从多个线程调用C ++代码,并且C ++代码具有全局静态变量,那么如果它有效则会很惊人。最简单的尝试是锁定调用,即在Java端更改

native int callToCppFunction(int parameter);

synchronized native int callToCppFunction(int parameter);

确保一次只有一个线程可以在C ++代码中。

然后还有另一个可能的问题,我在大约一年前碰到过:显然在Windows dll中,它可能不足以序列化对它的调用(即使用synchronized)。它们也可能需要每次从同一个线程调用 This回答解释了这可能是什么。解决方案是为Java端创建一个单线程执行程序,并通过它将所有调用路由到本机代码。