2014-09-01 92 views
0

我想了解一个不满意的链接错误。这是我正在观察的问题。System.loadLibrary的深度限制?

我有一个本地C++库,名为libmynative.solibmynative.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的深度限制?


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

而从谷歌NDK用户组:

+1

你怎么链接'libothernative.so'?你可以使用'ndk-depends'来列出它依赖的库。 – 2014-09-01 06:28:13

+0

@Alex - 就是这样(我在一个小时前用'readelf'计算出来的)。其他人编写了makefile,而构建共享对象的配方忽略了'LDFLAGS'和'LDLIBS'。所以'libstlport_shared.so'不存在。 – jww 2014-09-01 06:46:43

+0

@Alex - 如果您想回答,我很乐意为您赢得积分,因为您击败了我。 – jww 2014-09-01 06:47:21

回答

0

我能够跟踪到一个缺失的依赖项。

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