1.简介

1.Android.mk是一个向Android NDK构建系统描述NDK项目的GNU makefile片段。主要用来编译生成一下几种:1.APK程序:一般的Android应用程序,系统级别的直接push即可。2.JAVA库:JAVA类库,编译打包生成jar文件。3.C\C++应用程序:可执行的C\C++应用程序。4.C\C++静态库:编译生成C\C++静态库,并打包成.a文件。5.C\C++共享库:编译生成共享库,并打包成.so文件。

2.案例

# 定义当前模块路径 (必须定义在文件开头,只需定义一次)
LOCAL_PATH := $(call my-dir)# 清空当前环境变量 (LOCAL_PATH除外)
include $(CLEAR_VARS)# 当前模块名 (这里会生成libhello-jni.so) 模块名必须唯一,不能包含空格
LOCAL_MODULE := hello-jni# 当前模块包含的源代码文件 多个可以用空格隔开
LOCAL_SRC_FILES := hello-jni.c# 生成一个动态库(表示当前模块被编译成一个共享库)
include $(BUILD_SHARED_LIBRARY)

3.编译多个共享库

一个Android.mk可能编译产生多个共享库模块,如下产生了libmodule1.so 和 libmodule2.so两个库
LOCAL_PATH := $(call my-dir)#模块1
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
include $(BUILD_SHARED_LIBRARY)#模块2
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
include $(BUILD_SHARED_LIBRARY)

4.编译静态库

Android应用程序不能直接使用静态库,但是静态库可以用来编译成动态库。比如在将第三方代码添加到原生项目中时,
可以不用直接将第三方源码包含在原生项目中,而是将第三方源码编译成静态库,然后并入共享库LOCAL_PATH := $(call my-dir)# 第三方库AVI
include $(CLEAR_VARS)
LOCAL_MODULE := AVI
LOCAL_SRC_FILES := AVI.c
include $(BUILD_STATIC_LIBRARY)#原生模块
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
#将静态库模块名添加到LOACAL_STATIC_LIBRARIES变量
LOCAL_STAITC_LIBRAYIES := AVI
include $(BUILD_SHARED_LIBRARY)

5.使用共享库共享通用模块

静态库可以保证源代码模块化,但是当静态库与共享库相连时,它就变成了共享库的一部分。在多个共享库的情况下,
多个共享库与静态库连接时,需要将通用模块的多个副本与不同的共享库重复相连,这样就增加了app的大小,这种
情况,可以将通用模块作为共享库。LOCAL_PATH := $(call my-dir)# 第三方库AVI
include $(CLEAR_VARS)
LOCAL_MODULE := AVI
LOCAL_SRC_FILES := AVI.c
include $(BUILD_SHARED_LIBRARY)#原生模块1
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
LOCAL_SHARED_LIBRARIES := AVI
include $(BUILD_SHARED_LIBRARY)#原生模块2
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
LOCAL_SHARED_LIBRARIES := AVI
include $(BUILD_SHARED_LIBRARY)

6.在多个NDK项目间共享模块

1.首先将AVI源代码移动到NDK项目以外的位置
2.作为共享模块,AVI需要有自己的Android.mk模块
3.以transcode/avilib为参数调用函数宏import-module添加到NDK项目的Android.mk文档末尾#AVI模块自己的Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AVI
LOCAL_SRC_FILES := AVI.c
include $(BUILD_SHARED_LIBRARY)#使用共享模块的NDK项目1的Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
LOCAL_SAHRED_LIBRARIES := AVI
include $(BUILD_SHARED_LIBRARY)
$(call import-module, transcode/AVI)#使用共享模块的NDK项目2的Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c
LOCAL_SAHRED_LIBRARIES := AVI
include $(BUILD_SHARED_LIBRARY)
$(call import-module, transcode/AVI)

7.使用预编译库

1.想在不发布源代码的情况下降模块发布给他人
2.想使用共享模块的预编译版来加速编译过程#使用预编译共享模块的Android.mk文件
LOCAL_PATH := $(call my-dir)
#第三方预编译库
include $(CLEAR_VARS)
LOCAL_MODULE := AVI
LOCAL_SRC_FILES := libAVI.so
include $(PREBUILD_SHARED_LIBRARY)

8.编译独立的可执行文件

1.为了方便测试和进行快速开发,可以编译成可执行文件。不用打包成apk就可以复制到Android设备上直接执行
#独立可执行模块的Andriod.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
LOCAL_STAITC_LIBRAYIES := AVI
include $(BUILD_EXECUTABLE)

9.注意事项

1.假如我们本地库libhello-jni.so依赖于libTest.so(可以使用NDK下的ndk-depends查看so的依赖关系)
2.在Android 6.0版本之前,需要在加载本地库前先加载被依赖的so
3.在Android6.0版本之后,不能再使用预编译的动态库(静态库没问题)# Android 6.0版本之前:
System.loadLibrary("Test");
System.loadLibrary("hello-jni");# Android 6.0版本之后:
System.loadLibrary("hello-jni");

实例:
step1: 在src/main目录下新建ndk目录

step2:编写hello-jni.c和Android.mk
hellojni.c

#include<jni.h>int test() {return 123;
}jint Java_com_lcj_ndktest_MainActivity_nativeTest() {return test();
}

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := hello-jni.cinclude $(BUILD_SHARED_LIBRARY)

step3: 定义native方法

public class MainActivity extends AppCompatActivity {// 加载so{System.loadLibrary("hello-jni");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = findViewById(R.id.tv_text);textView.setText(nativeTest() + "");}// 定义nativenative int nativeTest();
}

step4: 配置app下的build.gradle

defaultConfig {applicationId "com.lcj.ndktest"minSdkVersion 19targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"// 指定源文件的编译方式以及配置编译选项externalNativeBuild {ndkBuild {abiFilters "arm64-v8a","armeabi-v7a"}}}// 配置编译脚本路径externalNativeBuild {ndkBuild {path "src/main/ndk/Android.mk"}}

Android.mk介绍相关推荐

  1. Android.mk介绍(一)

    一.Android.mk简介 在Linux下,可以通过Makefile来对源码工程进行管理,Android.mk文件是Makefile的一小部分,它用来对Android程序进行编译.Android.m ...

  2. Android.mk 入门学习

    我们还是采用RK3399的开发板来学习Android.mk NOTED: 在编译之前,我们需要source & lunch source build/envsetup.sh lunch rk3 ...

  3. android.mk简单介绍

    application.mk简介: 0. 基础知识介绍: Application.mk用来描述应用程序需要哪些modules.Application.mk通常放在:$PROJECT/jni/Appli ...

  4. android.mk官网介绍,转载:Android.mk语法介绍

    Android.mk内的变量定义 3.1 LOCAL_PATH 一个Android.mk file首先必须定义好LOCAL_PATH变量.它用于在开发树中查找源文件.例如: 1.LOCAL_PATH: ...

  5. Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App

    目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...

  6. Android.mk文件详解介绍

    Android.mk 编译文件是用来向 Android NDK描述你的 C,C++源代码文件的,   这篇文档描述了它的语法.在阅读下面的内容之前,假定你已经阅读了 docs/OVERVIEW.TXT ...

  7. Android.mk 语法和变量介绍

    一.简介 Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件. 官网对 Android.mk 的介绍:https://developer.android.com/ ...

  8. android.mk 里面内容介绍

    大致如下 # 这个是固定的必须要写的,作用是构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径 LOCAL_PATH:= $(call my-dir) ...

  9. Android.mk 用法介绍

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

最新文章

  1. AI生成的代码你敢用吗?
  2. Python控制流:顺序结构、分支结构、循环结构+for、if ... else、while、if... elif...elif..else、if
  3. 020_Jedis的Set数据类型
  4. C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
  5. 20211217 为什么正定矩阵的主子式都是正的?(注意是主子式,不止是顺序主子式)
  6. 四叶草社交平台——十天冲刺(5)
  7. win10下安装Ubuntu18.4双系统(适合小白)
  8. python 读取一个文件夹下所有图像
  9. Redis配置和持久性
  10. javaScript中的变量作用域的闭包处理
  11. 递归回溯求解数独 C++实现方法
  12. 国产化操作系统安装OpenJDK Icedtea插件
  13. windows开启nfs_win7专业版怎么开启nfs_win7专业版启用nfs步骤
  14. 【深入浅出指南:JVM知多少】一、JVM内存模型
  15. 二分类资料校准曲线calibration curve的绘制
  16. 中国都有哪些顶级优秀的程序员?
  17. 浅谈UML中常用的几种图——鲁棒图
  18. ubuntu wps缺少字体_一个字体:系统风汜霰汜源圆
  19. 下列哪个不属于计算机的应用范围,、下列哪个选项不 属于计算机的应用软件。...
  20. 使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!

热门文章

  1. java粒子特效教程_使用particles.js实现网页背景粒子特效
  2. 项目进度经常超时,如何有效管理项目进度?
  3. 新零售mysql设计(购物券表 客户关联购物券表)二次修改
  4. Android开发黑白灰模式和夜间模式设置
  5. 新咪咕Mg100、M101-强刷固件-刷机包
  6. Python用*输出菱形
  7. C#学习 winform实现简单音乐播放器
  8. DateTimeFormatter 日期的格式化与解析
  9. 辰皇怎么过鸿蒙,抢《诛仙2·末日与曙光》百级金身法身
  10. 未拉手刹撞到前面车的动画_如何使用手刹将任何视频文件转换为任何格式