【发布时间】:2018-11-29 07:32:26
【问题描述】:
我们有一个非常简单的要求,即从 Java 调用几个本机函数。我们正在使用 JNA 进行这些本地调用。
编辑:我们没有任何自定义本机代码。我们正在调用 Linux Kernel C 库函数。
我们遇到了非常奇怪的内存损坏错误,例如
- `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java' 中的错误:malloc():内存损坏:0x00007f9b7849fc40李>
- `/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64/jre/bin/java' 中的错误:损坏的大小与 prev_size:0x00007f253c4470f0
- SIGSEGV (0xb)
程序甚至有时会挂断。这些错误是间歇性的。
在 JNA 调用中使用结构的一些标准示例/文档会很有帮助。
这是我们的具有原生函数的库包装器:
这些是映射到 C 中结构的原生模型:
这就是我们访问库函数的方式:
val timeVal = new NTPTimeVal()
TimeLibrary.ntp_gettimex(timeVal)
println(timeVal.tai)
您可以参考 TimeServiceImpl.scala 以获得更清晰的信息。
谁能告诉我们我们到底做错了什么?
【问题讨论】:
-
本机代码中很可能出错。可以展示一下吗?
-
我们正在进行 3 个本地调用,所有调用都内置在 Linux 内核 C 库代码中。我们还没有编写任何自定义 C 代码。
标签: java c memory-leaks native jna