gpt4 book ai didi

java - 运行 JNI native 代码时的 JRE SIGSEGV

转载 作者:行者123 更新时间:2023-11-30 04:59:21 26 4
gpt4 key购买 nike

我需要通过 JNI 接口(interface)在 Java 对象和外部 OCaml 程序之间传输数据,但在访问 native 代码中的对象字段时遇到麻烦。

在 Java 方面,我有一个包含多个字段的类:

public class GPSState {

int fix;
double course;
double hmsl;
...
}

我将 GPSState 类的对象 jstate 传递给 C 部分,我尝试将其字段设置为外部程序提供的相应值保存在本地结构 state 中:

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, "course", "D");
(*env)->SetDoubleField( env, cls, fid, state.course);

fid = (*env)->GetFieldID( env, cls, "hmsl", "D");
(*env)->SetDoubleField( env, cls, fid, state.hmsl);

...

从调试打印中,我了解到类已成功定位,并且 fixcourse 字段已正确识别和设置。但是,在对 Course 字段执行 SetDoubleField 调用(通过调用行后立即的调试打印确认)之后,当我尝试访问任何内容时,我总是会收到 SIGSEGV fatal error 其他领域:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x01109720, pid=11665, tid=3079347056
#

后来我发现,当我将操作course字段的代码移动到设置字段的C函数的最末尾时,错误消失了并且所有字段都按预期设置没有任何问题。

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

现在,我知道我在某种程度上弄乱了内存,但我不知道在哪里以及如何弄乱。我已经按照《JNI 程序员指南》中的“字段和方法”一章来检查可能的错误,但在我看来,我所做的一切都是按书本进行的。更有经验的人会如此友善地指出问题可能出在哪里吗?

最佳答案

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

这看起来不对。您正在尝试设置对象实例字段,但您正在传递 cls而不是jstate作为要访问的对象。您应该使用以下内容:

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

对您的其他Set<type>Field进行相应的更改也可以调用。

关于java - 运行 JNI native 代码时的 JRE SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7465709/

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