我开发 NDK 应用已经有一段时间了,而且运行良好。然而,今天这个应用程序随机决定不再启动,在我做了一些名义上的更改后编译它之后。这是由加载应用程序的主库时出现的神秘问题引起的。这是一些日志输出:
08-11 18:38:11.220 D/dalvikvm( 1237): Added shared lib /mnt/asec/com.audia.rta-1/lib/libqtandroid.so 0x40513bd8
08-11 18:38:11.220 D/dalvikvm( 1237): No JNI_OnLoad found in /mnt/asec/com.audia.rta-1/lib/libqtandroid.so 0x40513bd8, skipping init
08-11 18:38:11.220 D/dalvikvm( 1237): Trying to load lib /mnt/asec/com.audia.rta-1/lib/librta.so 0x40513bd8
08-11 18:38:11.260 D/AndroidRuntime( 1237): Shutting down VM
08-11 18:38:11.260 W/dalvikvm( 1237): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-11 18:38:11.260 E/AndroidRuntime( 1237): FATAL EXCEPTION: main
08-11 18:38:11.260 E/AndroidRuntime( 1237): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1311]: 67 cannot locate '_ZNSaIcEC1Ev'...
08-11 18:38:11.260 E/AndroidRuntime( 1237):
08-11 18:38:11.260 E/AndroidRuntime( 1237): at java.lang.Runtime.loadLibrary(Runtime.java:434)
08-11 18:38:11.260 E/AndroidRuntime( 1237): at java.lang.System.loadLibrary(System.java:554)
08-11 18:38:11.260 E/AndroidRuntime( 1237): at com.audia.rta.RTA.onCreate(RTA.java:139)
根据 Google 的一些结果,_ZNSaIcEC1Ev
是 libstdc++
的一部分。我已经检查过,它在构建过程中被链接,g++
被用于链接。
奇怪的是,恢复到应用程序的旧 apk 可以解决问题,但是编译旧版本并安装它不能解决问题。我的构建系统中的所有内容都已 checkin 版本控制,并且我已经完成了几个干净的构建。我所有的构建今天都在工作,然后他们就停止工作了。我没有升级或安装任何东西;它发生在我正在测试新代码的过程中。发生了什么事?
更新:从新 checkout 的拷贝构建并不能解决问题。
更新 2: 有什么方法可以追踪到该符号的链接,也许可以使用 objdump
?也许这可以提供一些线索。
最佳答案
我最终使用全新的 NDK 安装编译了所有内容,并且成功了。就好像旧的以某种方式被损坏了,虽然我不知道是如何损坏的。
也是从r5b
升级到r6
,所以可能和NDK版本有关。
关于android - 库突然不会在动态链接器(NDK)中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034299/