1

我有一个有趣的问题,导致我在过去 24 小时内失去了一半的头发,而且它有点复杂,所以我希望世界上的某个地方有耐心读完这篇文章,然后能够提供帮助我出去!

我们有一个在 JBoss 中运行的 Java EE 应用程序,它使用 JNA 调用 RedHat 6.3 上的本机 C++ 库。我们使用的 C++ 库曾经是 32 位的,但最近已移植到 64 位。我们现在正在更新 JBoss 应用程序以使用 64 位 JVM (RHEL JRE 1.6_43.1) 运行。

当我们将 Native 库移植到 64 位时,我们使用 C++ 测试存根来测试 JNA 使用的所有公共接口——所有这些测试都顺利通过。

现在,当我尝试使用 JNA 访问 64 位本机库时,出现以下错误:

#
# A fatal error has been detected by the Java Runtime Environment
# 
#  SIGSEGV (0xb) at pc=0x0000003718b32fbc, pid=4489, tid=140200254654208
#
# JRE version: 6.0_22-b22
# Java VM: OpenJDK 64-Bit Server VM (20.0-b11 mixed mode linux-amd64 compresssed oops)
# Derivative: IcedTea6 1.10.6
# Distribution: Red Hat Enterprise Linux Server release 6.2 (Santiago), package rhel-1.43.1.10.6.el6_2-x86_64
# Problematic frame:
# C  [libc.so.6+0x132fbc]  __tls_get_addr@@GLIBC_2.3+0x132fbc
#
# ...

我已将错误的根源追溯到对第三方库的调用,该第三方库是从我们最近移植的本机库中调用的。对第三方库的调用是使用来自 Native 库中的一组值进行的,而不是传递到库中的值。

因此,出于某些原因,我们得到以下行为: - 从 C++ 测试存根调用本机库:成功 - 通过 JNA 从 Java 调用本机库:失败(段错误)

对于问题可能是什么,我已经没有什么想法了,而且我对 JNA 和 C++ 的知识缺乏严重阻碍了我(我来自一个主要是 Java 的团队,并且在完成这项任务时遇到了短线)。如果有人有任何信息、指针、建议等,将不胜感激。

提前致谢!

4

0 回答 0