Android NDK编译遇到的一些问题

14 篇文章 2 订阅

在配置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符号

参照下面的博文进行了设置,仍然没效

https://developer.android.com/ndk/guides/stable_apishttps://developer.android.com/ndk/guides/stable_apis

【我的OpenGL学习进阶之旅】解决NDK使用OpenGL ES 3.0 的api报错:error: undefined reference to ‘glUnmapBuffer‘_字节卷动的博客-CSDN博客

又对到底使用LDLIBS还是LDFLAGS疑惑,进行了一番搜索。(结论:系统库推荐使用LDLIBS)

LOCAL_LDLIBS vs. LOCAL_LDFLAGShttps://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,不管是打包静态库,还是打包动态库,都加了这句。有点疑惑它的作用,特意搜了一下

gcc编译参数-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

c++ - Can't use enum class as unordered_map key - Stack Overflowhttps://stackoverflow.com/questions/18837857/cant-use-enum-class-as-unordered-map-key需要提供hash算子。

我是简单修改为map ok了。

(这里有个疑惑,之前使用cmake构建的时候没问题,换成Android.mk就有问题了,为什么?

补充一下,好像c++14没有这个问题了,我用的是c++11来编的) 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值