NDK 开发 之Android.mk 和Application.mk

526 阅读1分钟

三步打造动态so包

参考文档

Android 官网

ndk文档

Android_mk

Application_mk

ndk环境配置

local.properties 文件

ndk.dir =/xxx/xxx/android-ndk-r14b

1.Android.mk

## 1.当前路径
LOCAL_PATH := $(call my-dir)
## 修改当前路径在xxx目录下
LOCAL_PATH :=$(LOCAL_PATH)/xxx/

## 2.依赖第三方so
include $(CLEAR_VARS)
## 定义模块名字
LOCAL_MODULE := libxxx
## 加载不同架构的so(如:"armeabi-v7a" ,"arm64-v8a")
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libxxx.so
##根据您使用的是共享库 (.so) 还是静态库 (.a),添加 PREBUILT_SHARED_LIBRARY 或 PREBUILT_STATIC_LIBRARY。
include $(PREBUILT_SHARED_LIBRARY)

## 3.需要打包的模块配置
include $(CLEAR_VARS)
## 原生库名称
LOCAL_MODULE := mylib
#遍历路径include下所有 .cpp、 .c、 .h 文件
LOCAL_C_INCLUDES :=$(LOCAL_PATH)/include/
MY_CPP_PATH  := $(LOCAL_PATH)/
My_All_Files := $(shell find $(MY_CPP_PATH)/.)
My_All_Files := $(My_All_Files:$(MY_CPP_PATH)/./%=$(MY_CPP_PATH)%)
MY_CPP_LIST  := $(filter %.cpp %.c %.h ,$(My_All_Files))
MY_CPP_LIST  := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
# 加载源文件
LOCAL_SRC_FILES :=  $(MY_CPP_LIST)
#依赖的so模块
LOCAL_SHARED_LIBRARIES  := libxxx

# 编译动态库
include $(BUILD_SHARED_LIBRARY)

2.Application.mk

APP_STL:=c++_shared
#要为项目中的所有 C++ 编译传递的标记
APP_CPPFLAGS := -frtti -fexceptions

# 不同框架指令集
APP_ABI := armeabi,armeabi-v7a,arm64-v8a

#声明构建此应用所面向的 Android API 级别,并对应于应用的 minSdkVersion
APP_PLATFORM := android-21
## 原生库名称
APP_MODULES :=  mylib

3.build.gradle 封装ndk-build 命令行,在gradle的Task 里面找到ndkBuild 并且执行

task ndkBuild(type: Exec) {
    Properties properties = new Properties()
    properties.load(project.rootProject.file('local.properties').newDataInputStream())
    def ndkDir = properties.getProperty('ndk.dir')
    commandLine "$ndkDir/ndk-build", '-C', file('src/main/jni').absolutePath
}

成功后会自动生成libs包和obj包,里面有不同框架的so包.