JNIを使用して sun-java6-jdkがインストールされたXUbuntu 8.10の会計プリンタを制御するJavaクラスを実装する必要があります。g ++シンボルのバージョン管理。 g ++のバージョン4を使用してGCC_3.0に設定してください
構造は以下の通りである
EpsonDriver.java負荷がlibEpsonが私が使用(エプソン、なしソースによって提供される)EpsonFiscalProtocol.soと動的にリンクし、
をpthreadのれる
をlibEpson.so javahを使用してヘッダファイルを生成し、コードをコンパイルします。それから私は、$ JAVA_HOME/JRE/libに/ i386のでlibEpson.soを入れ、EpsonDriver.javaは私がのいずれかの方法を使用しようとすると、一部の作品は、しかし、私が得ること
System.loadLibrary("libEpson")
initializar静的を使用していますunsatisfiedLinkError例外です。私が手に最近コンパイルされたファイルで
Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
filesz 0x0000ccc4 memsz 0x0000ccc4 flags r-x
LOAD off 0x0000d000 vaddr 0x0000d000 paddr 0x0000d000 align 2**12
filesz 0x00000250 memsz 0x00044a5c flags rw-
DYNAMIC off 0x0000d014 vaddr 0x0000d014 paddr 0x0000d014 align 2**2
filesz 0x000000f0 memsz 0x000000f0 flags rw-
NOTE off 0x000000d4 vaddr 0x000000d4 paddr 0x000000d4 align 2**2
filesz 0x00000024 memsz 0x00000024 flags r--
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rw-
Dynamic Section:
NEEDED EpsonFiscalProtocol.so
NEEDED libpthread.so.0
NEEDED libstdc++.so.6
NEEDED libm.so.6
NEEDED libc.so.6
SONAME libcom_tichile_jpos_EpsonSerialDriver.so
INIT 0x00007254
FINI 0x0000ba08
GNU_HASH 0x000000f8
STRTAB 0x00001f50
SYMTAB 0x00000ae0
STRSZ 0x00002384
SYMENT 0x00000010
PLTGOT 0x0000d108
PLTRELSZ 0x00000008
PLTREL 0x00000011
JMPREL 0x0000724c
REL 0x000045c4
RELSZ 0x00002c88
RELENT 0x00000008
TEXTREL 0x00000000
VERNEED 0x00004564
VERNEEDNUM 0x00000002
VERSYM 0x000042d4
RELCOUNT 0x000000ac
Version References:
required from libstdc++.so.6:
0x056bafd3 0x00 05 CXXABI_1.3
0x08922974 0x00 04 GLIBCXX_3.4
required from libc.so.6:
0x0b792650 0x00 03 GCC_3.0
0x0d696910 0x00 02 GLIBC_2.0
:
Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
filesz 0x00005300 memsz 0x00005300 flags r-x
LOAD off 0x00005300 vaddr 0x00006300 paddr 0x00006300 align 2**12
filesz 0x00000274 memsz 0x00010314 flags rw-
DYNAMIC off 0x00005314 vaddr 0x00006314 paddr 0x00006314 align 2**2
filesz 0x000000e0 memsz 0x000000e0 flags rw-
EH_FRAME off 0x00004a00 vaddr 0x00004a00 paddr 0x00004a00 align 2**2
filesz 0x00000154 memsz 0x00000154 flags r--
Dynamic Section:
NEEDED libstdc++.so.5
NEEDED libm.so.6
NEEDED libgcc_s.so.1
NEEDED libc.so.6
SONAME EpsonFiscalProtocol.so
INIT 0x00001cb4
FINI 0x00004994
HASH 0x000000b4
STRTAB 0x00000da4
SYMTAB 0x000004f4
STRSZ 0x00000acf
SYMENT 0x00000010
PLTGOT 0x0000640c
PLTRELSZ 0x00000270
PLTREL 0x00000011
JMPREL 0x00001a44
REL 0x000019dc
RELSZ 0x00000068
RELENT 0x00000008
VERNEED 0x0000198c
VERNEEDNUM 0x00000002
VERSYM 0x00001874
RELCOUNT 0x00000004
Version References:
required from libstdc++.so.5:
0x056bafd2 0x00 04 CXXABI_1.2
required from libc.so.6:
0x09691f73 0x00 03 GLIBC_2.1.3
0x0d696910 0x00 02 GLIBC_2.0
だから私はいくつかの時間前、同僚が動作するバージョンをした
、および-Dslxをobjdumpの使用は、私は次のようになりましたメインのdiferenceがGCC_3.0シンボルであると思われるlibcom_tichile_EpsonSerialDriver.soを次のコマンドでコンパイルしました(私は現在仕事中ではありません)
g++ -Wl,-soname=.... -shared -I/*jni libraries*/ -o libcom_tichile_jpos_EpsonSerialDriver -lEpsonFiscalProtocol -lpthread
g ++にそのシンボルバージョンを使用するよう指示する方法はありますか?またはそれを動作させる方法のアイデアですか?
編集:私はfollowinダンプと別の非作業バージョンがあります。幸いなことに、同僚:
Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
filesz 0x0000bf68 memsz 0x0000bf68 flags r-x
LOAD off 0x0000cc0c vaddr 0x0000cc0c paddr 0x0000cc0c align 2**12
filesz 0x000005e8 memsz 0x00044df0 flags rw-
DYNAMIC off 0x0000cc20 vaddr 0x0000cc20 paddr 0x0000cc20 align 2**2
filesz 0x000000f8 memsz 0x000000f8 flags rw-
EH_FRAME off 0x0000b310 vaddr 0x0000b310 paddr 0x0000b310 align 2**2
filesz 0x000002bc memsz 0x000002bc flags r--
STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
filesz 0x00000000 memsz 0x00000000 flags rw-
RELRO off 0x0000cc0c vaddr 0x0000cc0c paddr 0x0000cc0c align 2**0
filesz 0x000003f4 memsz 0x000003f4 flags r--
Dynamic Section:
NEEDED EpsonFiscalProtocol.so
NEEDED libpthread.so.0
NEEDED libstdc++.so.6
NEEDED libm.so.6
NEEDED libgcc_s.so.1
NEEDED libc.so.6
SONAME libcom_tichile_jpos_EpsonSerialDriver.so
INIT 0x000055d8
FINI 0x0000a968
HASH 0x000000f4
GNU_HASH 0x00000a30
STRTAB 0x00002870
SYMTAB 0x00001410
STRSZ 0x00002339
SYMENT 0x00000010
PLTGOT 0x0000cff4
PLTRELSZ 0x00000168
PLTREL 0x00000011
JMPREL 0x00005470
REL 0x00004ea8
RELSZ 0x000005c8
RELENT 0x00000008
VERNEED 0x00004e38
VERNEEDNUM 0x00000002
VERSYM 0x00004baa
RELCOUNT 0x00000001
Version References:
required from libstdc++.so.6:
0x056bafd3 0x00 05 CXXABI_1.3
0x08922974 0x00 03 GLIBCXX_3.4
required from libc.so.6:
0x09691f73 0x00 06 GLIBC_2.1.3
0x0d696914 0x00 04 GLIBC_2.4
0x0d696910 0x00 02 GLIBC_2.0
を今、私は主な違いは、GCC_3.0記号/ ABI
EDITであると思います
詳細については、unsatisfiedLinkError例外を参照してください。どのシンボル、バージョン、またはライブラリが欠けているのでしょうか? 不完全な情報で正解を返すのは難しいです。 –
いいえJavaスタックトレースに追加情報がありません。 libcom_tichile_jpos_EpsonSerialDriver.soとEpsonFiscalProtocol.soのリンクに何らかの非互換性があると思われます。 .soファイルを削除すると、javaはライブラリをロードできないというエラーを表示します。関数signaturaは、作業バージョンと動作していないバージョンで同じです。だから私は立ち往生している.. – Ismael