实用的Android.mk用例

通过一个实例说明Android.mk的用法,四个module: add,sub,multi和div,分别对应四种编译方式:shared,static,prebuilt shared,prebuilt static.项目结构如图:
这里写图片描述
各个Android.mk内容如下:

src/main/cpp/Android.mk

include $(call all-subdir-makefiles)

src/main/cpp/main/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE           := native-lib
LOCAL_SRC_FILES        := main.cpp #注意这里如果是native-lib.cpp,有可能出现奇葩的无法编译通过的问题,所以最好源文件名与模块名不相同
LOCAL_LDLIBS           := -llog #这里添加需要用到的存在于手机上的共享库,这些库并不会编译到最终的so文件中,而是当在手机上运行时系统自动加载/system/lib/liblog.so,这样的库典型的还有libz.so(压缩库),libm.so(数学库)等等,要查看系统有哪些支持的库,可参考https://developer.android.com/ndk/guides/stable_apis(目前不是很全),也可以查看ndk-bundle/platforms/android-XX/arch-arm/usr/lib目录下的so
LOCAL_SHARED_LIBRARIES := moduleadd modulemulti
LOCAL_STATIC_LIBRARIES := modulesub modulediv
include $(BUILD_SHARED_LIBRARY)

src/main/cpp/add/Android.mk(shared方式)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := moduleadd
LOCAL_SRC_FILES := add.cpp
LOCAL_LDLIBS    := -llog
LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH) #试了多次,这里都不能生效,也就是main必修include这个add.h才行...
include $(BUILD_SHARED_LIBRARY)

src/main/cpp/sub/Android.mk(static方式)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := modulesub
LOCAL_SRC_FILES := sub.cpp
LOCAL_EXPORT_LDLIBS := -llog #静态库的LOCAL_LDLIBS会被忽略掉,因此这个库如果想打log,需要这么写,保证使用这个静态库的动态库依赖liblog
include $(BUILD_STATIC_LIBRARY)

src/main/cpp/multi/Android.mk(prebuilt shared方式)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := modulemulti
LOCAL_SRC_FILES := libmodulemulti.so #这里so的名字要与需要的最终模块的名字相同,因为我发现如果这个so名字为libmulti.so,那么生成的主so(native-lib.so)中needed的是libmodulemulti.so,但是打包到apk中的so是libmulti.so,这样就导致运行时找不到libmodulemulti.so而崩溃
LOCAL_LDLIBS    := -llog
LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH) #试了多次,这里都不能生效,也就是main必修include这个multi.h才行...
include $(PREBUILT_SHARED_LIBRARY)

src/main/cpp/div/Android.mk(prebuilt static方式)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := modulediv
LOCAL_SRC_FILES := libdiv.a #实际运行发现这里可以与模块的名字不相同,因为这个静态库最终会合并到主so中(native-lib.so),因此不会像预构建动态库那样出现崩溃
LOCAL_EXPORT_LDLIBS := -llog #静态库的LOCAL_LDLIBS会被忽略掉,因此这个库如果想打log,需要这么写,保证使用这个静态库的动态库依赖liblog
include $(PREBUILT_STATIC_LIBRARY)

另外,目前Android Studio对.c文件支持还不是很好,IDE中显示有语法错误,但其实能够编译成功.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值