Java 运行JNI本机代码时的JRE SIGSEGV

Java 运行JNI本机代码时的JRE SIGSEGV,java,java-native-interface,segmentation-fault,Java,Java Native Interface,Segmentation Fault,我需要通过JNI接口在Java对象和外部OCaml程序之间传输数据,但在访问本机代码中的对象字段时遇到困难 在Java方面,我有一个带有几个字段的类: public class GPSState { int fix; double course; double hmsl; ... } 我正在将GPSState类的对象jstate传递给C部件,我试图将其字段设置为外部程序提供的各自值,这些值保存在本地结构状态中: jclass-c

我需要通过JNI接口在Java对象和外部OCaml程序之间传输数据,但在访问本机代码中的对象字段时遇到困难

在Java方面,我有一个带有几个字段的类:

public class GPSState {

        int fix;
        double course;
        double hmsl;
        ...
}
我正在将
GPSState
类的对象
jstate
传递给C部件,我试图将其字段设置为外部程序提供的各自值,这些值保存在本地结构
状态中:

jclass-cls;
jfieldID-fid;
cls=(*env)->GetObjectClass(env,jstate);
fid=(*env)->GetFieldID(env,cls,“fix”,“I”);
(*env)->SetIntField(env、cls、fid、state.fix);
fid=(*env)->GetFieldID(env,cls,“课程”,“D”);
(*env)->SetDoubleField(env、cls、fid、state.course);
fid=(*env)->GetFieldID(env,cls,“hmsl”,“D”);
(*env)->SetDoubleField(env、cls、fid、state.hmsl);
...
从调试打印中,我了解到类已成功定位,
fix
course
字段已正确识别和设置。但是在执行
SetDoubleField
调用
course
字段后,调用行后面的调试打印确认了这一点,当我尝试访问任何其他字段时,我总是收到SIGSEGV致命错误:

#
#Java运行时环境检测到一个致命错误:
#
#pc=0x01109720、pid=11665、tid=307937056时的SIGSEGV(0xb)
#
后来我发现,当我将操作
course
字段的代码移动到设置字段的C函数的末尾时,错误消失了,所有字段都按预期设置,没有任何问题

我曾尝试在另一台机器上使用另一个JRE实现运行代码,但结果是相同的,只是在设置第一个
fix
字段后出现了错误(将代码的相应位移动到函数末尾,再次“解决”了问题)

现在,我知道我不知怎么搞砸了记忆,但我不知道在哪里,怎么搞的。我遵循了JNI程序员指南中的字段和方法章节来检查可能的错误,但在我看来,我所做的一切都是照本宣科的。有经验的人会不会如此友善地指出问题出在哪里?

(*env)->SetIntField(env、cls、fid、state.fix);
这看起来不对。您试图设置一个对象实例字段,但将
cls
而不是
jstate
作为要访问的对象。您应该使用以下选项:

(*env)->SetIntField( env, jstate, fid, state.fix);

对其他
设置字段
调用也进行相应更改。

该死,我怎么会错过呢?谢谢你,斯图尔特!