除此之外,咱们还应该学习ndk-build的哪些重要知识?
1、ndk-build工具如何指定编译生成的库文件位置? 2、ndk-build工具如何指定生成不同CPU平台对应的库文件?带着这些问题,咱们继续ndk-build之旅吧:
3.3.1、环境变量配置介绍NDK-Build定义时,提到了其实它是NDK的脚本工具。那么,咱们还是先进NDK目录找一下吧,ndk-build工具的位置如下图:
如果我们希望任意情况下都能便捷的使用这种脚本工具,通常做法是配置其环境变量,否则我们在cmd、Mac终端、Terminal中执行 ndk-build 命令时,会报错:“未找到命令”
配置NDK的环境变量,也很简单,以Mac电脑举例(如果是Windows电脑,网上也有很多关于配置环境变量的文章,如果有需要可自行查下):
1、打开命令终端,输入命令: open -e .bash_profile,打开bash_profile配置文件 2、写入如下内容(NDK_HOME指向 ndk-build 所在路径): export NDK_HOME=http://www.likecs.com/Users/xc/SDK/android-sdk-macosx/ndk/20.1.5948944 export PATH=$PATH:$NDK_HOME 3、生效.bash_profile配置 source .bash_profile当我们在cmd、Mac终端、Terminal中执行 ndk-build 命令时,如果出现下图所示内容,则代表配置成功了:
3.3.2、C/C++功能实现咱们使用比较常用的一种ndk-build方式吧:ndk-build + Android.mk + gradle配置
项目中新建jni目录,拷贝一份CMake的代码实现吧:
1、新建jni目录 2、拷贝cpp/native-lib.cpp 至 jni目录下 3、重命名为haha.cpp (与CMake区分) 4、调整一下native实现方法的文本(与CMake运行效果区分) 5、新建Android.mk文件接着,编写Android.mk文件内容:
#表示Android.mk所在目录 LOCAL_PATH := $(call my-dir) #CLEAR_VARS变量指向特殊 GNU Makefile,用于清除部分LOCAL_变量 include $(CLEAR_VARS) #模块名称 LOCAL_MODULE := haha #构建系统用于生成模块的源文件列表 LOCAL_SRC_FILES := haha.cpp #BUILD_SHARED_LIBRARY 表示.so动态库 #BUILD_STATIC_LIBRARY 表示.a静态库 include $(BUILD_SHARED_LIBRARY)配置gradle:
apply plugin: 'com.android.application' android { compileSdkVersion 28 defaultConfig { applicationId "com.aaa.testnative" minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //定义ndkBuild默认配置属性 externalNativeBuild { ndkBuild { cppFlags "" } } } //定义ndkBuild对应的Android.mk路径(重要) externalNativeBuild { ndkBuild{ path "src/main/jni/Android.mk" } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }现在,native代码、ndk-build配置都完成了,咱们运行看一下效果吧,如下图:
3.3.4、如何指定库文件的输出目录?通常,可在Android.mk文件中配置NDK_APP_DST_DIR
指定源目录与输出目录(与CMake类似)
可在gradle中配置abiFilters(与Cmake类似)
externalNativeBuild { ndkBuild { cppFlags "" abiFilters "arm64-v8a" } } externalNativeBuild { ndkBuild { cppFlags "" } } ndk { abiFilters "arm64-v8a" } 3.3.6、如何在Terminal中直接通过ndk-build命令构建库文件呢?