cannot locate symbol "atof" referenced by 报错分析以及解决方案

在stdlib.h中的库函数atof

在ndk android-19中:

 __NDK_FPABI__
static __inline__ double atof(const char *nptr)
{
    return (strtod(nptr, NULL));
}

 

在ndk android-21以及以上版本内:

extern double atof(const char*);

也就是说,在android-21(即android 5.0)以前,atof的函数实际是由strtod函数来实现的,而从android-21版本开始,atof将内置在android系统,不再需要内联strtod函数来实现,所以当使用android-21 ndk以上版本编译时,在android5.0以下的机器就会报错。

从大道理上面来讲,既然使用android-21来编译,那么就表示不再支持android-21以下的版本(android studio cmake就是根据build.gradle中minSdkVersion来选择ndk platform版本的。详见https://developer.android.com/ndk/guides/cmake)

所以,如果app版本还需要支持android5.0以下的版本,最好还是指定最低支持的android版本的ndk版本(比如minSDKVersion 为19,那么ndk的platform就选择android-19)

如果因为特殊原因非要在android-21以上编译,并在android5.0以下使用,那么只有修改ndk中stdlib.h的代码了:

将android-21以上的版本stdlib.h中的代码:

extern double atof(const char*);

修改成:

 __NDK_FPABI__
static __inline__ double atof(const char *nptr)
{
    return (strtod(nptr, NULL));
}

需要注意的是,atof需要在strtod函数的下面,否则编译会报错(原来的代码,atof在strtod上面,所以很容易就出错)

 

 

你可能感兴趣的:(NDK,android)