在Android中执行使用NDK编译的本机应用程序时出错。无法找到' log2' (在模拟器上正常工作)

时间:2014-09-19 11:23:38

标签: android-ndk static-linking libm

我(交叉)使用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 static linking)上有人抱怨libm.a和libm.so之间存在差异,但无论如何,因为它适用于我的模拟器,我认为编译是“好的”#34 ;

我完全坚持这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

最后我找到了问题的根源。

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

旧版本不包含此类函数,因此即使编译为“OK”,也会在运行时引发错误。使用较旧的平台/ 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

无论如何都没有提供很多细节。