在使用NDK进行JNI开发时,在静态库中使用了log2函数,然后在Android编译的时候报了这个个错误:error: undefined reference to ‘log2’;首先,google上走一番,基本可以确定这个问题是因为编译时链接不到’log2’这个函数所在的库而引起的,所以接下来就在从这个方向开始查。
PS:开发环境Eclipse+NDK17
由于log2这是数学函数,所以需要在makefile文件中添加响应库的引用,于是在makefile中搜了一番,果然没有加,果断加上:
STL_PATH=$(NDK_ROOT)/platform/android-14/arch-arm/user/lib
LOCAL_LDFLAGS += -lm
然后,编译失败…
在网上找了一下,有帖子说到math库再Android.mk链接时默认加入了,这就非常奇怪了。
由于在编译项目时在Application.mk中设置的APP_PLATFORM是android-14,于是就尝试将AP等级改为19,再次编译居然通过,这就非常有意思了;
为了找出编译通过的原因,对
(NDK_ROOT)/platform/android-14/arch-arm/user/lib
and
(NDK_ROOT)/platform/android-14/arch-arm/user/lib
下的libm.so库进行测试,分别读取这两个动态库里面的函数,结果如下(截取部分):
![libm.so对比](https://i-blog.csdnimg.cn/blog_migrate/a1b7a6f10d2539126ddd9c8ca60081c1.png)
左边是ndk-android-14中libm.so中的函数截图,右边为ndk-android-19中libm.so中的函数截图,可以看到左边函数列表中并没有log2函数,而右边则有。于是,又对其他api等级进行测试,发现该函数在18以前都没有,也就找到了error: undefined reference to ‘log2’的原因。
ps:查看动态库中函数的方法可以参考blog:
https://blog.csdn.net/cgwang_1580/article/details/81748636
推荐windows下使用命令行工具PoweShell,可以支持一些Linux命令,比cmd和cygmin似乎好用一些;(PowerShell使用方法可以直接在程序中搜索,or使用win+R,输入PowerShell即可)