Android 安卓ndk可以';找不到atof函数
我试图在我的Android项目中使用开源C库。此库使用Android 安卓ndk可以';找不到atof函数,android,android-ndk,Android,Android Ndk,我试图在我的Android项目中使用开源C库。此库使用atof()函数。我知道atof()是标准C库(stdlib.h)中定义的函数。因此,它应该在Android NDK(仿生库)上的标准C库中实现 但是,当我尝试加载包含此函数调用的库时,我收到一个运行时错误: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 86 cannot locate 'atof'.... 我是使用NDK进行And
atof()
函数。我知道atof()
是标准C库(stdlib.h)中定义的函数。因此,它应该在Android NDK(仿生库)上的标准C库中实现
但是,当我尝试加载包含此函数调用的库时,我收到一个运行时错误:
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 86 cannot locate 'atof'....
我是使用NDK进行Android开发的初学者,所以我可能错过了一些东西,比如标志、编译器指令等等
我的android.mk
文件是:
LOCAL\u路径:=$(调用我的目录)
包括$(清除变量)
本地\u允许\u未定义的\u符号:=真
LS_CPP=$(subst$(1)/,$(通配符$(1)/$(2)/*.c))
本地_模块:=libA
本地共享库:=\
libgmodule-2.0\
libgobject-2.0\
libgthread-2.0\
libglib-2.0
本地\u SRC\u文件:=sourceFile.c
包括$(构建共享库)
来自
atof
换句话说不是一个库函数,它是一个调用strod
的内联函数
如果需要通过加载库来调用,只需使用strtod即可。谷歌已经移动了一些C标准库函数,如atof()从头文件中的内联函数到普通函数。最新的NDK将默认构建一个。因此,它仅与在设备的标准C库(libc.so)中具有atof()函数的最新Android设备兼容。这意味着,如果在具有旧版本C库的旧设备上运行库,则加载dll时会出现错误,因为预期的atof()函数将不存在 您是否尝试在Application.mk中设置此选项:
APP_PLATFORM := android-9
这将导致ndk编译器生成与旧Android版本兼容的代码
您还可以尝试将NDK安装降级到版本10b(此版本早于将atof从内联移动到libc的一部分的更改,因此完全避免了此问题).这表明加载的库对象不是用NDK编译的,或者至少不是用NDK头正确编译的。尽管我有点惊讶,如果它是用另一个工具链构建的,它甚至在特定函数上失败,而不是拒绝尝试加载。@ChrisStratton Su我也很惊讶,NDK早于r5,但我怀疑使用的NDK没有那么旧。我正在使用NDKR8C。我刚刚下载了它,并使用NDKbuild-C“项目路径”没有任何标志和修饰符。我错过了什么?@void-你是从源代码构建所有内容,还是下载了预构建的。那么库呢?最好给开源库命名,或者与它的维护人员讨论这个问题。可能库的构建设置不好,使用了主机包含(即,用于你的电脑)而不是android包含部分构建过程。例如,如果有人在某个时候在非交叉编译配置中运行配置脚本,可能会发生这种情况。您是如何构建项目的?您是否使用android-ndk-r8d/docs/standalone-toolchain.html文件中记录的独立工具链?这可能是个问题使用运行时系统,您在…上运行应用程序,因为“构建系统自动将C库、数学库和C++支持库链接到您的本机代码,因此不需要在LoalAlxLDLBS行中列出它们。抱歉回答得太晚。LOCAL_ALLOW_UNDEFINED_SYMBOLS-关闭对未定义符号的检查,因此我错过了对stdlib.h(atof)的依赖在另一个文件中。这是我的错。我错误地忽略了这个标志。复制和粘贴是真正的邪恶。@void:您是否建议不要使用
LOCAL\u允许\u未定义的\u符号
?谢谢,对于新的gradle版本,您可以设置ndk{platformVersion=“9”
APP_PLATFORM := android-9