在配置Android.mk的时候,遇到了一些问题
1、mk文件没跑
检查代码,极可能是路径写错了,可以用$(warning $(DIR_3RDPARTY)) 打印,用ls 去看看有没有这个路径
变量赋值要用 :=,用=会导致不可预料的问题,例如变量在后续使用中被拼接了其他内容
//DIR_3RDPARTY := $(LOCAL_PATH)/../../3rdparty
### 例如这里写漏了:,直接用 = 赋值
DIR_3RDPARTY = $(LOCAL_PATH)/../../3rdparty
...
$(warning $(DIR_3RDPARTY))
include $(DIR_3RDPARTY)/x/jni/Android.mk
$(warning $(DIR_3RDPARTY))
#### 后面这两个mk没被执行,原因,前后打印DIR_3RDPARTY,发现DIR_3RDPARTY被拼接了其他内容(如/x/jni/Android.mk )!
include $(DIR_3RDPARTY)/xx/jni/Android.mk
include $(DIR_3RDPARTY)/xxx/jni/Android.mk
2、编译提示找不到glxxxx符号
参照下面的博文进行了设置,仍然没效
又对到底使用LDLIBS还是LDFLAGS疑惑,进行了一番搜索。(结论:系统库推荐使用LDLIBS)
LOCAL_LDLIBS vs. LOCAL_LDFLAGS
https://stackoverflow.com/questions/22354041/local-ldlibs-vs-local-ldflags
最后在出错信息里面发现
LOCAL_LDLIBS is always ignored for static libraries
我打包的是静态库,没法使用LDLIBS去链接。
最后的解决方法是,在使用这个静态库去编动态库的地方,加上依赖,我用的是GLES2
LOCAL_LDLIBS := -lEGL -lGLESv2
3、LOCAL_CFLAGS += -fPIC
在mk里面发现很多地方都用了LOCAL_CFLAGS += -fPIC,不管是打包静态库,还是打包动态库,都加了这句。有点疑惑它的作用,特意搜了一下
编译so动态库要链接.a静态库的时候才需要 fPIC
4、编译静态库的时候,只需要依赖其他库的头文件,不用动态依赖so,因为不会起作用
LOCAL_SHARED_LIBRARIES 在使用到这个静态库去编动态库的地方加即可。
LOCAL_SHARED_LIBRARIES := xx xxx xxxx
include $(DIR_3RDPARTY)/xx/jni/Android.mk
include $(DIR_3RDPARTY)/xxx/jni/Android.mk
include $(DIR_3RDPARTY)/xxxx/jni/Android.mk
5、编译error提示“Implicit instantiation of undefined template”
代码里面使用了unordered_map,使用了enum作为key
我是简单修改为map ok了。
(这里有个疑惑,之前使用cmake构建的时候没问题,换成Android.mk就有问题了,为什么?
补充一下,好像c++14没有这个问题了,我用的是c++11来编的)