System.loadLibrary的深度限制?

时间:2014-09-01 03:09:53

标签: android android-ndk java-native-interface shared-libraries native-methods

我正在尝试理解一个不满意的链接错误。这是我正在观察的问题。

我有一个名为libmynative.so的本机C ++库。 libmynative.so依赖于另一个名为libothernative.so的本机C ++库,而另一个本机依赖于STLPort。所以我的loadLibrary链看起来像:

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

libothernative.so的加载由于链接错误不满意而失败,但缺失的符号由libstlport_shared.so提供(已加载!)。

但是,如果libmynative.so换行libothernative.a(请注意静态库),以便loadLibrary链看起来像:

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

然后一切都成功了。我的libmynative.so仍然需要libstlport_shared.so提供的符号,但没有错误。

有什么可以解释这种行为?可以调用System.loadLibrary的数量是否有深度限制?


以下是没有答案的相关问题:

来自Google NDK用户群:

1 个答案:

答案 0 :(得分:0)

我能够将其追踪到缺失的依赖关系。

下面,在构建共享对象时,我使用--sysroot来包含头和库路径。我还在libstlport_shared.so中指定了$(LDLIBS)。但是,构建共享对象的命令不包括$(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
...