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

Ikh*_*laf 2 c++ java java-native-interface global-variables

我有一个从多线程java应用程序调用的JNI C++代码

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

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

非常感谢

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

Joo*_*kka 5

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

native int callToCppFunction(int parameter);
Run Code Online (Sandbox Code Playgroud)

synchronized native int callToCppFunction(int parameter);
Run Code Online (Sandbox Code Playgroud)

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

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