我有一个有趣的问题,导致我在过去的24小时内失去了一半的头发而且有点复杂,所以我希望世界上的某个地方有耐心阅读这个然后将是能够帮帮我!
我们有一个在JBoss中运行的Java EE应用程序,它使用JNA在RedHat 6.3上调用Native C ++库。我们使用的C ++库曾经是32位,但最近已被移植到64位。我们现在正在使用64位JVM(RHEL JRE 1.6_43.1)更新JBoss应用程序。
当我们将Native库移植到64位时,我们使用C ++测试存根来测试JNA使用的所有公共接口 - 所有这些测试都没有任何问题。
现在,当我尝试使用JNA访问64位Native库时,出现以下错误:
#
# 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的团队,并且在完成这项任务时吸取了很少的吸引力)。如果有人有任何信息,指示,建议等,将不胜感激。
提前致谢!