Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ndk 在Android中执行使用NDK编译的本机应用程序时出错。找不到';log2';(在emulator上工作正常)_Android Ndk_Static Linking_Libm - Fatal编程技术网

Android ndk 在Android中执行使用NDK编译的本机应用程序时出错。找不到';log2';(在emulator上工作正常)

Android ndk 在Android中执行使用NDK编译的本机应用程序时出错。找不到';log2';(在emulator上工作正常),android-ndk,static-linking,libm,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

我(交叉)使用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
在另一篇帖子()中,有人抱怨libm.a和libm.so之间的差异,但无论如何,由于它在我的模拟器上工作,我认为编译“有点不错”


我完全被困在这一点上了。有什么想法吗?

我终于找到了问题的根源

我使用/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平台中包含的“电池”的最佳信息来源是:


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

最后我找到了问题的根源

我使用/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平台中包含的“电池”的最佳信息来源是:


无论如何,这并不能提供很多细节。

我也有同样的问题。如果我使用android-19+进行编译,编译过程中一切都很顺利,但在运行时崩溃。如果我使用android-x(其中没有定义“log2f”)编译,我会在编译期间收到一条警告消息:“内置函数log2f的声明不兼容”,并且在运行时再次收到相同的错误。有什么想法吗?@unichiduci使用android-3。您的C代码还必须(通过#ifdef宏)检查log2f是否在任何地方都没有定义,并将其替换为自己的自定义版本。ffmpeg就是这样。它将使用自己的数学库修复错误:。使用较新的android版本ffmpeg进行编译将检测到log2f函数已经由外部库提供并链接到它。在这种情况下,它只在较新的Android设备中工作。NDK不像使用Java前端那样干净,Java前端隐藏了所有这些复杂性。#定义log2f(x)(logf(x)/logf(2.0f))问题已解决:)。我也有同样的问题。如果我使用android-19+进行编译,编译过程中一切都很顺利,但在运行时崩溃。如果我使用android-x(其中没有定义“log2f”)编译,我会在编译期间收到一条警告消息:“内置函数log2f的声明不兼容”,并且在运行时再次收到相同的错误。有什么想法吗?@unichiduci使用android-3。您的C代码还必须(通过#ifdef宏)检查log2f是否在任何地方都没有定义,并将其替换为自己的自定义版本。ffmpeg就是这样。它将使用自己的数学库修复错误:。使用较新的android版本ffmpeg进行编译将检测到log2f函数已经由外部库提供并链接到它。在这种情况下,它只能在较新的Android设备上工作。NDK不像使用Java前端那样干净,因为Java前端隐藏了所有这些复杂性。#定义log2f(x)(logf(x)/logf(2.0f))问题已解决:)。