Android.mk介绍
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介绍相关推荐
- Android.mk介绍(一)
一.Android.mk简介 在Linux下,可以通过Makefile来对源码工程进行管理,Android.mk文件是Makefile的一小部分,它用来对Android程序进行编译.Android.m ...
- Android.mk 入门学习
我们还是采用RK3399的开发板来学习Android.mk NOTED: 在编译之前,我们需要source & lunch source build/envsetup.sh lunch rk3 ...
- android.mk简单介绍
application.mk简介: 0. 基础知识介绍: Application.mk用来描述应用程序需要哪些modules.Application.mk通常放在:$PROJECT/jni/Appli ...
- android.mk官网介绍,转载:Android.mk语法介绍
Android.mk内的变量定义 3.1 LOCAL_PATH 一个Android.mk file首先必须定义好LOCAL_PATH变量.它用于在开发树中查找源文件.例如: 1.LOCAL_PATH: ...
- Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...
- Android.mk文件详解介绍
Android.mk 编译文件是用来向 Android NDK描述你的 C,C++源代码文件的, 这篇文档描述了它的语法.在阅读下面的内容之前,假定你已经阅读了 docs/OVERVIEW.TXT ...
- Android.mk 语法和变量介绍
一.简介 Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件. 官网对 Android.mk 的介绍:https://developer.android.com/ ...
- android.mk 里面内容介绍
大致如下 # 这个是固定的必须要写的,作用是构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径 LOCAL_PATH:= $(call my-dir) ...
- Android.mk 用法介绍
一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...
最新文章
- AI生成的代码你敢用吗?
- Python控制流:顺序结构、分支结构、循环结构+for、if ... else、while、if... elif...elif..else、if
- 020_Jedis的Set数据类型
- C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
- 20211217 为什么正定矩阵的主子式都是正的?(注意是主子式,不止是顺序主子式)
- 四叶草社交平台——十天冲刺(5)
- win10下安装Ubuntu18.4双系统(适合小白)
- python 读取一个文件夹下所有图像
- Redis配置和持久性
- javaScript中的变量作用域的闭包处理
- 递归回溯求解数独 C++实现方法
- 国产化操作系统安装OpenJDK Icedtea插件
- windows开启nfs_win7专业版怎么开启nfs_win7专业版启用nfs步骤
- 【深入浅出指南:JVM知多少】一、JVM内存模型
- 二分类资料校准曲线calibration curve的绘制
- 中国都有哪些顶级优秀的程序员?
- 浅谈UML中常用的几种图——鲁棒图
- ubuntu wps缺少字体_一个字体:系统风汜霰汜源圆
- 下列哪个不属于计算机的应用范围,、下列哪个选项不 属于计算机的应用软件。...
- 使用Python转换PDF,Word/Excel/PPT/md/HTML都能转!
热门文章
- java粒子特效教程_使用particles.js实现网页背景粒子特效
- 项目进度经常超时,如何有效管理项目进度?
- 新零售mysql设计(购物券表 客户关联购物券表)二次修改
- Android开发黑白灰模式和夜间模式设置
- 新咪咕Mg100、M101-强刷固件-刷机包
- Python用*输出菱形
- C#学习 winform实现简单音乐播放器
- DateTimeFormatter 日期的格式化与解析
- 辰皇怎么过鸿蒙,抢《诛仙2·末日与曙光》百级金身法身
- 未拉手刹撞到前面车的动画_如何使用手刹将任何视频文件转换为任何格式