我(交叉)使用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 ;
我完全坚持这一点。有什么想法吗?
答案 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
无论如何都没有提供很多细节。