安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord (4)

除此之外,咱们还应该学习ndk-build的哪些重要知识?

1、ndk-build工具如何指定编译生成的库文件位置? 2、ndk-build工具如何指定生成不同CPU平台对应的库文件?

带着这些问题,咱们继续ndk-build之旅吧:

3.3.1、环境变量配置

介绍NDK-Build定义时,提到了其实它是NDK的脚本工具。那么,咱们还是先进NDK目录找一下吧,ndk-build工具的位置如下图:

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

如果我们希望任意情况下都能便捷的使用这种脚本工具,通常做法是配置其环境变量,否则我们在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

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

当我们在cmd、Mac终端、Terminal中执行 ndk-build 命令时,如果出现下图所示内容,则代表配置成功了:

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

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文件

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

接着,编写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配置都完成了,咱们运行看一下效果吧,如下图:

安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord

3.3.4、如何指定库文件的输出目录?

通常,可在Android.mk文件中配置NDK_APP_DST_DIR
指定源目录与输出目录(与CMake类似)

#表示Android.mk所在目录 LOCAL_PATH := $(call my-dir) #设置库文件的输入目录 #输出目录 ../jniLibs/ #源目录 $(TARGET_ARCH_ABI) NDK_APP_DST_DIR=../jniLibs/$(TARGET_ARCH_ABI) #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) 3.3.5、如何生成指定CPU平台对应的库文件呢?

可在gradle中配置abiFilters(与Cmake类似)

externalNativeBuild { ndkBuild { cppFlags "" abiFilters "arm64-v8a" } } externalNativeBuild { ndkBuild { cppFlags "" } } ndk { abiFilters "arm64-v8a" } 3.3.6、如何在Terminal中直接通过ndk-build命令构建库文件呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzyf.html