過去 24 時間で髪の半分を失う原因となった興味深い問題があり、それは少し複雑なので、世界のどこかでこれを読む忍耐力があり、助けてくれることを願っています。私から!
JNA を使用して RedHat 6.3 のネイティブ C++ ライブラリを呼び出す Java EE アプリケーションを JBoss で実行しています。使用していた C++ ライブラリは、以前は 32 ビットでしたが、最近 64 ビットに移植されました。現在、64 ビット JVM (RHEL JRE 1.6_43.1) を使用して実行するように JBoss アプリケーションを更新中です。
ネイティブ ライブラリを 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
#
# ...
エラーの原因を突き止めたところ、最近移植されたネイティブ ライブラリ内から呼び出されたサード パーティ ライブラリに対して行われている呼び出しが原因でした。サード パーティ ライブラリへの呼び出しは、ライブラリに渡される値ではなく、ネイティブ ライブラリ内から発生した一連の値で行われています。
したがって、何らかの理由で、次のような動作が得られます: - C++ テスト スタブからネイティブ ライブラリを呼び出す: 成功 - JNA を介して Java からネイティブ ライブラリを呼び出す: 失敗 (segfault)
問題が何であるかについてのアイデアが不足しており、JNA と C++ の両方の知識が不足しているため、私は真剣に足を引っ張っています (私は主に Java チームの出身で、このタスクを取得するのに短いストローを描きました)。誰かが情報、指針、アドバイスなどを持っていれば、それは大歓迎です。
前もって感謝します!