文章目录

  • I . 源码编译配置
  • II . 构建脚本配置
  • III . NDK 函数库打包配置
  • IV . Java 与 C 代码示例
  • V . CMake 配置 ( CMakeLists.txt )
  • VI . ndkBuild 配置 ( Android.mk )
  • VII . 博客相关资源下载

I . 源码编译配置


1 . 源码编译配置 :

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码如何编译成动态库的 ;

③ 常用配置 : 一般配置将源码编译成哪几个 CPU 的指令集 ;

目前只支持 armeabi-v7a , arm64-v8a , x86 , x86-64 四种 CPU 指令集架构 ;

2 . 配置层级 : 在 android 下 defaultConfig 中配置的 externalNativeBuild 是配置 AS 中的 C/C++ 源码编译内容的 ;

注意区分配置 : externalNativeBuild 有两种类型的配置 , 一种在 defaultConfig 内部 , 一种在 defaultConfig 外部 ;

① defaultConfig 内部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件编译参数

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径

2 . 配置脚本示例 ( 省略无关内容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {.../*关于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 架构*/// 配置 AS 工程中的 C/C++ 源文件的编译//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {cmake {cppFlags ""//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}...}...
}

II . 构建脚本配置


1 . 构建脚本配置 :

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置本工程中的 C/C++ 源码的构建脚本 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 两种编译脚本中的一种 ( 只能二选一 ) ;

2 . cmake 配置 : 配置使用 CMake 编译 C/C++ 时的构建脚本 CMakeList.txt 路径 ;

① cmake 简介 : 使用 CMake 进行构建 , 构建脚本是 CMakeList.txt , 是 Android Studio 中新引入的 NDK 本地代码构建方式 ;

② 路径设置 : 路径的起点就是 build.gradle 文件所在的目录 , 即 app 目录 ;

② 配置示例 :

    externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}

3 . ndkBuild 配置 : 配置使用 ndkBuild 编译 C/C++ 时的构建脚本 Android.mk 路径 ;

① ndkBuild 简介 : 使用 ndkBuild 进行构建 , 构建脚本是 Android.mk , 是从 Eclipse + ADT 环境遗留下来的配置 NDK 编译方案 , 逐步被 CMake 替代 ;

② 路径设置 : 路径的起点就是 build.gradle 文件所在的目录 , 即 app 目录 ;

② 配置示例 :

    externalNativeBuild {ndkBuild{path "src/main/cpp/Android.mk"}

3 . 配置层级 : 在 android 与 defaultConfig 平级的 externalNativeBuild 是配置 AS 中的 C/C++ 源码编译构建脚本的 ;

注意区分配置 : externalNativeBuild 有两种类型的配置 , 一种在 defaultConfig 内部 , 一种在 defaultConfig 外部与之平级的配置 ;

① defaultConfig 内部的 externalNativeBuild : 配置的是配置 AS 工程的 C/C++ 源文件编译参数

② defaultConfig 外部的 externalNativeBuild : 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径

4 . 配置脚本示例 ( 省略无关内容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {...}// 配置 NDK 的编译脚本路径// 编译脚本有两种 ① CMakeList.txt ② Android.mk//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径//  使用该配置时 , 将 ndkBuild 配置注释掉cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}// 配置 Android.mk 构建脚本路径//  使用该配置时 , 将 cmake 配置注释掉/*ndkBuild{path "src/main/cpp/Android.mk"}*/}...
}
...

III . NDK 函数库打包配置


1 . 构建脚本配置 :

① 配置位置 : Module 级别的 build.gradle 中进行配置 ;

② 主要作用 : 主要作用是配置 APK 打包动态库的相关参数 ; 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库 , 那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置 ;

③ 常用配置 : 配置 cmake 或 ndkBuild 两种编译脚本中的一种 ( 只能二选一 ) ;

2 . 配置脚本示例 ( 省略无关内容 ) :

apply plugin: 'com.android.application'android {...defaultConfig {.../*关于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 架构*///配置 APK 打包 哪些动态库//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置ndk{// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}...}...
}

IV . Java 与 C 代码示例


1 . Java 代码 :

package kim.hsl.compile;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {static {//此处只能加载动态库 , 不能加载静态库System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}public native String stringFromJNI();}

2 . C 代码 :

#include <jni.h>
#include <android/log.h>JNIEXPORT jstring JNICALL
Java_kim_hsl_compile_MainActivity_stringFromJNI(JNIEnv *env,jobject obj) {__android_log_print(ANDROID_LOG_INFO, "JNI_TAG", "Hello from C");return (*env)->NewStringUTF(env, "Hello from C");
}

V . CMake 配置 ( CMakeLists.txt )


1 . CMakeLists.txt 配置示例 :


# 声明 CMake 版本
cmake_minimum_required(VERSION 3.4.1)# 添加库
add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).native-lib.c)# 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib
#   这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
#   不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
find_library(log-liblog)# 链接库
target_link_libraries(native-lib${log-lib})

2 . 对应的 build.gradle 中的 NDK 配置 :

apply plugin: 'com.android.application'android {.../*关于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 指令集架构*/// 配置 AS 工程中的 C/C++ 源文件的编译//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {cmake {cppFlags ""//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}//配置 APK 打包 哪些动态库//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置ndk{// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}// 配置 NDK 的编译脚本路径// 编译脚本有两种 ① CMakeList.txt ② Android.mk//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径//  使用该配置时 , 将 ndkBuild 配置注释掉cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}// 配置 Android.mk 构建脚本路径//  使用该配置时 , 将 cmake 配置注释掉/*ndkBuild{path "src/main/cpp/Android.mk"}*/}...
}
...

VI . ndkBuild 配置 ( Android.mk )


1 . Android.mk 配置示例 :


# my-dir 是 NDK 内置的函数 , 获取当前的目录路径
#   在该案例中就是 Android.mk 文件所在的目录的绝对路径 , 工程根目录/app/src/main/cpp
#   将该目录赋值给 LOCAL_PATH 变量
#   所有的 Android.mk 的第一行配置都是该语句LOCAL_PATH := $(call my-dir)# 打印 LOCAL_PATH 值
# Build 打印内容 : LOCAL_PATH : Y:/002_WorkSpace/001_AS/005_NDK_Compile/app/src/main/cpp
# 编译 APK 时会在 Build 中打印$(info LOCAL_PATH : $(LOCAL_PATH))# 配置新的模块之前都要先清除 LOCAL_XXX 变量
#   LOCAL_PATH 变量会保留include $(CLEAR_VARS)# 配置动态库名称
# 动态库命名规则 : 在 LOCAL_MODULE 基础上 , 添加 lib 前缀 和 .so 后缀
# 生成动态库名称 : libnative-lib.soLOCAL_MODULE := native-lib# 编译的源文件LOCAL_SRC_FILES := native-lib.c# 配置构建的目标是动态库include $(BUILD_SHARED_LIBRARY)

2 . 对应的 build.gradle 中的 NDK 配置 :

apply plugin: 'com.android.application'android {.../*关于 CPU 指令集NDK 17 以上只支持 armeabi-v7a, arm64-v8a, x86, x86-64 四种 CPU 指令集架构*/// 配置 AS 工程中的 C/C++ 源文件的编译//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {cmake {cppFlags ""//配置编译 C/C++ 源文件为哪几个 CPU 指令集的函数库 (arm , x86 等)abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}//配置 APK 打包 哪些动态库//  示例 : 如在工程中编译的函数库 , 其提供了 arm, x86, mips 等指令集的动态库//        那么为了控制打包后的应用大小, 可以选择性打包一些库 , 此处就是进行该配置ndk{// 打包生成的 APK 文件指挥包含 ARM 指令集的动态库abiFilters "armeabi-v7a" , "arm64-v8a", "x86", "x86_64"}}// 配置 NDK 的编译脚本路径// 编译脚本有两种 ① CMakeList.txt ② Android.mk//     defaultConfig 内部的 externalNativeBuild 配置的是配置 AS 工程的 C/C++ 源文件编译参数//     defaultConfig 外部的 externalNativeBuild 配置的是 CMakeList.txt 或 Android.mk 构建脚本的路径externalNativeBuild {// 配置 CMake 构建脚本 CMakeLists.txt 脚本路径//  使用该配置时 , 将 ndkBuild 配置注释掉/*cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}*/// 配置 Android.mk 构建脚本路径//  使用该配置时 , 将 cmake 配置注释掉ndkBuild{path "src/main/cpp/Android.mk"}}...
}
...

VII . 博客相关资源下载


CSDN 博客地址 : 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

博客资源下载地址 : https://download.csdn.net/download/han1202012/12152060

示例代码 GitHub 地址 : https://github.com/han1202012/005_NDK_Compile

【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )相关推荐

  1. Android应用开发揭秘[高清PDF版+源码]

    编辑推荐 本书内容全面,不仅详细讲解了Android框架.Android组件等基础知识,而且还深入阐述了传感器.语音识别.桌面组件开发等高级知识,最重要的是还全面介绍了如何利用原生的C/C++(NDK ...

  2. Android通用开发笔记和高性能安卓开发框架源码

    笔记列表 云炬Android开发笔记(准备篇) Android studio及AVD模拟器的安装调试教程 云炬Android开发笔记 2项目初始化 云炬Android开发笔记 3框架主配置的入口的设计 ...

  3. ANDROID物联网开发从入门到实战附源码

    本书从获取源码和搭建应用开发环境开始讲起,依次讲解了基础知识篇.数据传输篇.信息识别篇.传感器应用篇和技术提高篇这 5大部分内容. 目录 第1篇 基础知识篇 第1章 Android系统介绍 2 1.1 ...

  4. NUC980第一篇:开发环境的搭建以及官方源码编译

    序言 之前参加了一个rtthread举办的活动,拿到了一个新塘的NK-IOT的板子. 于是,打算研究一下,跑一跑linux. 官方buildroot编译 下载地址: https://gitee.com ...

  5. android studio密钥库口令,Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码...

    本文将带你了解Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码,希望本文对大家学Android有所帮助. " 一.签名打包两种方式 1. ...

  6. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  7. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...

    本文将带你了解Android应用开发Android Studio数字签名打包apk图文步骤教程,希望本文对大家学Android有所帮助. Android Studio数字签名打包release版apk ...

  8. android修改用户名和密码错误,Android应用开发Android Studio 修改用户名、密码、URL等操作教程...

    本文将带你了解Android应用开发Android Studio 修改用户名.密码.URL等操作教程,希望本文对大家学Android有所帮助. 修改用户名.密码: 在AndroidStudio的ter ...

  9. android程序包不存在,Android应用开发Android studio 错误: 程序包 不存在

    本文将带你了解Android应用开发Android studio 错误: 程序包 不存在,希望本文对大家学Android有所帮助. " Android studio 错误: 程序包 不存在 ...

最新文章

  1. 变换域隐写术检测分析
  2. RTL设计推荐的各步骤 推荐工具 适合VHDL verilog
  3. windows无法远程
  4. C#窗体应用中使用ZedGraph曲线插件绘制图表
  5. 怎样的项目才能称为“成功项目”?
  6. LeetCode 143 重排链表-中等
  7. 服务器虚拟机密度,服务器整合:虚拟机密度大未必是好事
  8. Android背景透明的 Dialog
  9. 转自JavaEye --Oracle函数大全
  10. java-php-python-ssm基于移动端的选课系统的设计与实现服务器端计算机毕业设计
  11. python 报错:UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xa5‘ in position 65
  12. (8)echo 命令
  13. 极大似然估计原理思想
  14. SpringCloud系列之版本选择
  15. POJ 3069 Saruman's Army(萨鲁曼军)
  16. 开发android电视app
  17. 2017年阿里云生态大事记
  18. AD域USB禁用详解
  19. hotmail手机端_Hotmail下载_Hotmail官方app手机最新版安装 - 人人下载
  20. 我的中国“芯”,手把手教你设计CPU

热门文章

  1. sass 插值语句的使用
  2. bzoj 1058: [ZJOI2007]报表统计 (Treap)
  3. ESP系列AT指令开发笔记
  4. JAVA课程设计——“小羊吃蓝莓”小游戏
  5. Nginx的配置文件nginx.conf详解
  6. 懒加载中进行字典转模型
  7. 如何让滚动条出现在左边
  8. SpringCloud学习(七)高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)
  9. Android面试收集录13 Android虚拟机及编译过程
  10. jQuery中 trigger() bind() 使用心得