1

我使用 Android-NDK(交叉)编译了一个二进制文件,在编译/链接阶段没有错误。应用程序是静态链接的。

使用 Nesux7 模拟器我执行:

 $ adb shell mount -o remount,rw /system
 $ adb push myApp /system/bin
 $ adb shell /system/bin/myApp

它工作“正常”并打印正确的输出。

然后我创建最终的 apk 并安装在真机上。它无法执行。调试应用程序:

 $ adb shell
 $ run-as com.blablabla.myapp
 $ cd /data/data/com.blablabla.myapp/files/bin
 $ ./myApp

引发下一个错误:

reloc_library[1306]: 21538 cannot locate 'log2'...
CANNOT LINK EXECUTABLE

在另一篇文章(NDK:libm 静态链接)上,有人抱怨 libm.a 和 libm.so 之间的差异,但无论如何,因为它适用于我的模拟器,我认为编译“还不错”。

我完全被困在这一点上。任何想法?

4

1 回答 1

4

终于找到了问题的根源。

我使用 /opt/android-ndk-r9d/platforms/android- 19作为 NDK。这个版本已经在标准的 libm 平台中包含了 log2 和其他数学函数,所以在使用这个版本的 Android 的设备/模拟器中编译或执行时没有问题。

旧版本不包含此类功能,因此即使编译“正常”,也会在运行时引发错误。使用旧平台 /opt/android-ndk-r9d/platforms/android- 3 ) 源代码 (avconv/ffmpeg) 检测到它并用 libavutil/libm.h 中的自定义宏替换它。这保证它可以在任何 Android 版本中运行,从而解决编译/运行问题。

关于每个平台/android-N 中包含的内容的文档并不多。我能找到的关于不同 NDK 平台中包含的“电池”的最佳信息来源是:

http://mobilepearls.com/labs/native-android-api/ndk/docs/STABLE-APIS.html

无论如何,这并没有提供很多细节。

于 2014-10-02T09:30:10.147 回答