我从多线程java应用程序中调用了JNI C ++代码
这个C ++代码有2个全局静态变量,一个布尔值和一个字符串。
由于某种原因,我不断从此代码中获得分段错误。知道是什么导致了这个吗?我知道这不是线程安全的,但我将变量视为只读java应用程序,只有C ++代码才能修改这些变量的值
非常感谢
编辑:此代码在Linux机器上运行。并且一次运行几个月没有任何问题,然后它发出信号11分段故障和JVM崩溃。
答案 0 :(得分:5)
如果您从多个线程调用C ++代码,并且C ++代码具有全局静态变量,那么如果它有效则会很惊人。最简单的尝试是锁定调用,即在Java端更改
native int callToCppFunction(int parameter);
到
synchronized native int callToCppFunction(int parameter);
确保一次只有一个线程可以在C ++代码中。
然后还有另一个可能的问题,我在大约一年前碰到过:显然在Windows dll中,它可能不足以序列化对它的调用(即使用synchronized
)。它们也可能需要每次从同一个线程调用 。 This回答解释了这可能是什么。解决方案是为Java端创建一个单线程执行程序,并通过它将所有调用路由到本机代码。