0

不満足なリンク エラーを理解しようとしています。これが私が観察している問題です。

というネイティブ C++ ライブラリがありlibmynative.soます。libmynative.soと呼ばれる別のネイティブ C++ ライブラリにlibothernative.so依存し、他のネイティブは STLPort に依存します。したがって、私のloadLibraryチェーンは次のようになります。

static {
    System.loadLibrary("stlport_shared");
    System.loadLibrary("othernative");
    System.loadLibrary("mynative");
}

満たされていないリンク エラーが原因で の読み込みにlibothernative.so失敗していますが、不足しているシンボルは によって提供されてlibstlport_shared.soいます (これは既に読み込まれています!)。

ただし、チェーンが次のようになるように (静的ライブラリに注意してください)libmynative.soラップする場合:libothernative.aloadLibrary

System.loadLibrary("stlport_shared");
System.loadLibrary("mynative");

その後、すべてが成功します。によって提供されたシンボルlibmynative.soがまだ必要libstlport_shared.soですが、エラーはありません。

この動作を説明できるものは何ですか? System.loadLibrary呼び出すことができる数に深さ制限はありますか?


回答がない関連する質問は次のとおりです。

Google NDK ユーザー グループから:

4

1 に答える 1

0

これを依存関係の欠落まで追跡することができました。

以下では、共有オブジェクトを構築するときに--sysroot、ヘッダーとライブラリ パスを含めていました。にも明記libstlport_shared.soしてい$(LDLIBS)ます。ただし、共有オブジェクトを構築するコマンドには and が含まれていませんでした$(LDFLAGS)($(LDLIBS)他の誰かが makefile を書きました)。

Readelf はそれが欠けていることを示しました:

$ arm-linux-androideabi-readelf -d libcryptopp.so

Dynamic section at offset 0x34472c contains 26 entries:
 Tag        Type                         Name/Value
 0x00000003 (PLTGOT)                     0x346e30
 0x00000002 (PLTRELSZ)                   904 (bytes)
 ...
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]
...

$ make static dynamic
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c 3way.cpp
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c adler32.cpp
arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -c algebra.cpp
...

arm-linux-androideabi-g++ -DNDEBUG -g2 -Os -pipe -fPIC -DCRYPTOPP_DISABLE_ASM
--sysroot=/opt/android-ndk-r9/platforms/android-14/arch-arm
-I/opt/android-ndk-r9/sources/cxx-stl/stlport/stlport/ -shared -o libcryptopp.so
3way.o adler32.o algebra.o algparam.o arc4.o asn.o authenc.o base32.o base64.o
... wait.o wake.o whrlpool.o xtr.o xtrcrypt.o zdeflate.o zinflate.o zlib.o
...
于 2014-09-01T06:44:54.453 に答える