android.mk使用简介(以PREBUILT_SHARED_LIBRARY和BUILD_SHARED_LIBRARY扩展描述)

NDK提供的共享库(Prebuilt) Android NDK r5 开始支持预编译库(动态库和静态库),即程序能使用库的预编译版本。 该特性可用于以下两方面: 1)向第三方NDK开发人员发布你的共享库而不用提供源码。 2)使用一个提前编译好的库(预编译库)来加速编译过程。 本文说明该特性如何工作。 I. 声明一个预编译库的模块 对于Android编译工具而言,每个预编译库必须声明为一个独立的模块。这里举一个例子,假设 li 阅读详情
AI摘要

本文深入解析Android NDK如何使用预编译库加速开发流程,包括预编译动态库与静态库的声明及引用方法,以及Android.mk文件中关键参数的详细解释。

前言:

       Android NDK目前支持预编译库,使用一个编译好的库(动态库/静态库)来使编译过程加快,并且开发人员向外不用提供源码,而是以动态库的形式提供。

1. 使用预编译动态库模块

1.1 申明预编译模块

       对于Android编译工具而言,每个预编译库必须声明为一个独立的模块。例如: libc.so 文件与 Android.mk 位于同一个目录中,则可以这样定义该动态库:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libc
LOCAL_SRC_FILES := libc.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libc
include $(PREBUILT_SHARED_LIBRARY)
注意:LOCAL_EXPORT_C_INCLUDES定义确保了任何依赖这个预编译库的模块
会自动在自己的LOCAL_C_INCLUDES 变量中增加到这个预编译库的include目
录的路径,从而能够找到其中的头文件。

预编译模块不需要编译,因此可以大大减少编译耗时。libc.so预编译模块会被拷贝到 $PROJECT/obj/local 下面,同时还会被拷贝到 $PROJECT/lib/下。

 

1.2 引用预编译模块

       通过第一步申明了预编译模块之后,如果test.c依赖于libc.so。即可以使用LOCAL_SHARED_LIBRARIES列出当前模块的依赖列表。

include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES:= test.c
LOCAL_SHARED_LIBRARIES := libc
include $(BUILD_EXECUTABLE)

2. 构建动态库模块

include $(CLEAR_VARS)#这一步操作主要是清空之前定义的LOCAL_XXX开头的变量,是必须要的操作
LOCAL_C_INCLUDES:=$(LOCAL_PATH)/include  #定义源文件所需的头文件所需的目录
LOCAL_MODULE:=libhello-android #定义编译出来的模块名
LOCAL_SHARED_LIBRARIES := liblog  #编译此模块需要依赖的动态库
LOCAL_SRC_FILES := src/hello-android.c #定义编译模块所需的源文件
include $(BUILD_SHARED_LIBRARY)

3. 其他参数介绍

Android.mk部分参数介绍

LOCAL_PATH

每个Android.mk文件必须由LOCAL_PATH开始,用于在development tree中查找源文件

include $(CLEAR_VARS)

CLEAR_VARS指向一个指定的GNU Makefile,并清理许多LOCAL_XXX变量,比如LOCAL_MODULE, LOCAL_SRC_FILES等,它并不清理LOCAL_PATH。因为所有的编译控制文件由同一个GNU Makefile解析和执行,其变量是全局的,所以必须清理后才能避免相互影响

LOCAL_MODULE

每一个模块的名称必须是唯一的且不能包含任何空格。系统在构建shared-library时,会自动加上前缀lib和后缀.so

注意:如果模块名称本身已经是以lib开头,则系统不会再加入前缀,只是会加入后缀

LOCAL_SRC_FILES

指明当前模块的源文件(C/C++文件),缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION修改

BUILD_SAHRED_LIBRARY

该变量指向一个构建脚本并收集所有通过LOCAL_XXX变量指定的关于当前模块的信息,并根据你所列出的源文件构建一个动态库(.so)使用该变量前,你应该至少定义了LOCAL_MODULE和LOCAL_SRC_FILES

BUILD_STATIC_LIBRARY

用来构建一个静态库(.a)

PREBUILT_SHARED_LIBRARY

用来指定一个预先已经编译好的动态库,与BUILD_SAHRED_LIBRARY和BUILD_STATIC_LIBRARY不同,该模块对应的LOCAL_SRC_FILES不能是源文件,而只能是一个已经编译好的的动态库的路径,如foo/libfoo.so

PREBUILT_STATIC_LIBRARY

用来指定一个预先已经编译好的静态库

TARGET_ARCH

指定目标CPU架构,对于大多数兼容ARM指令的构建,通常使用arm,与CPU架构版本无关

TARGET_PLATFORM

指定目标平台的Android API版本号。

例如,androi4.4系统对应的值是:TARGET_PLATFORM := android-19

TARGET_ARCH_ABI

指定CPU的名称和架构,你可以指定一个或多个值,可取的值有:

  • ARMv5TE -----> armeabi
  • ARMv7 -----> armeabi-v7a
  • ARMv8 AArch64 -----> arm64-v8a
  • i686 -----> x86
  • x86-64 -----> x86-64
  • mips32(r1) -----> mips
  • mips64(r6) -----> mips64
  • All -----> all

TARGET_ABI

连接了Android API和ABI两个值,例如:TARGET_ABI := android-19-arm64-v8a

LOCAL_MODULE_FILENAME

该选项可以重写模块的默认名称,例如:

LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo

系统最终会生成libnewfoo.so

LOCAL_SRC_FILES

包含了构建该模块的源文件列表。可以使用相对路径也可以使用绝对路径,不过最好不要使用绝对路径而使用相对路径,这样可以方便移植

LOCAL_CPP_EXTENSION

指出C++源文件的扩展名

LOCAL_CPP_FEATURES

该变量指明当前模块所依赖的C++特性(可选)
推荐使用该变量代替在LOCAL_CPPFLAGS选项中传入-frtti和-fexception
使用该变量允许系统对于每个模块各自使用合适的flag,而使用LOCAL_CPPFLAGS则会导致编译器给所有模块都使用传入的flags

LOCAL_CPP_FEATURES := rtti --> (use Runtime Type Information)

LOCAL_CPP_FEATURES := exceptions --> (use C++ exceptions)

LOCAL_C_INCLUDES

指明编译时的include路径列表,相对于NDK ROOT目录

LOCAL_CFLAGS

指明在编译C/C++时要添加的flags

注意:不要在这改变优化选项和调试等级,这些选项应该在Application.mk中自动指定

也可以指定include目录:

LOCAL_CFLAGS += -I<path>

这个方法比LOCAL_C_INCLUDES要好一些,因为可以被ndk-gdb所使用

LOCAL_CXXFLAGS

LOCAL_CPPFLAGS的别名

LOCAL_CPPFLAGS

指明编译C++代码时的flags,这些选项在编译器的命令行中会跟在LOCAL_CFLAGS后面

LOCAL_STATIC_LIBRARIES

指明编译模块时需要的静态库列表
如果当前模块是动态库或可执行文件,该变量会告诉编译器将该变量列出的静态库连接到最终的二进制文件上
如果当前模块一个静态库,该变量只是简单的指明其他依赖当前模块的库同时也依赖该变量声明的这些库

LOCAL_SHARED_LIBRARIES

列出当前模块在runtime时依赖的动态库

LOCAL_WHOLE_STATIC_LIBRARIES

静态库全链接,不同于LOCAL_STATIC_LIBRARIES,类似于使用--whole-archive

LOCAL_LDLIBS

该变量包含了在编译动态库或可执行文件时的附加连接选项列表。它允许你使用-l前缀来传递指定的系统库,例如:

LOCAL_LDLIBS := -lz

上面的代码告诉编译器在编译模块时还要连接/system/lib/libz.so

LOCAL_ALLOW_UNDEFIEND_SYMBOLS

默认情况下,系统在编译动态库时遇到undefined reference错误时,会抛出undefined symbol error
如果将该变量设为true,则会关闭undefined reference检查

如果你在编译静态库时指定该变量,系统会忽略该变量

LOCAL_ARM_MODE

默认情况下,系统产生的二进制文件是thumb模式,每个指令是16位,并且连接这/thumb下STL libraries。通过将该变量设为arm,可以让产生的指令变为32位,例如:

LOCAL_ARM_MODE := arm

也可以将某一个源文件以.arm结尾以此来指定该文件要被编译成arm模式,例如: 

LOCAL_SRC_FILES := foo.c bar.c.arm

注意:也可以在Application.mk中指定APP_OPTIM := debug来达到同样的目的 

LOCAL_ARM_NEON

该变量只有在将ABI指定为armeabi-v7a时才有效。设置为true时,会讲浮点编译成neon指令,这会极大地加快浮点运算(前提是硬件支持)
同时,也可以将某一个源文件以.neon结尾来指定该源文件支持neon,例如:

LOCAL_SRC_FILES := foo.c.neon bar.c zoo.c.arm.neon

上面的代码指明了zoo.c设为arm模式同时支持neon 

LOCAL_DISABLE_NO_EXECUTE

Android NDK r4添加了NX bit安全特性,该选项默认是开启的,如果要关闭,可以将LOCAL_DISABLE_NO_EXECUTE这个变量设为true
该变量并不改变ABI,同时只在ARMv6+ CPU的设备开启

LOCAL_DISABLE_RELRO

默认情况下, NDK在编译代码时会加入read-only relocations和GOT protection
该变量指明runtime linker在relocation之后确保内存为read-only,同时确保security exploit更为困难。

这些保护只在Android API 16及以上才起作用

将这个变量LOCAL_DISABLE_RELRO设为true,可以将上述机制关闭

LOCAL_DISABLE_FORMAT_STRING_CHECKS

默认情况下, 系统在编译时会进行string格式的检查。这个检查默认是开启的,不过可以将LOCAL_DISABLE_FORMAT_STRING_CHECKS这个变量设为true来取消这个检查

LOCAL_EXPORT_CFLAGS

在该变量中声明的所有flags都会添加到在那些以LOCAL_STATIC_LIBRARIES或者LOCAL_SHARED_LIBRARIES声明依赖当前静态库或动态库的模块的LOCAL_CFLAGS中,例如:

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)

 

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLGAS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SAHRED_LIBRARY)

这里,系统会将-DFOO=1和-DBAR=2都传入给bar.c
另外,所有依赖关系都是传递的,如果zoo依赖bar,而bar又依赖foo,则zoo同样继承了foo模块的所有exported flags
系统并不会传递exported flags给当前模块,举例来说,-DFOO=1并不会传递给foo

LOCAL_EXPORT_CPPFLAGS

导出include paths,例如,该变量会告诉bar.c应该包含foo模块的头文件

LOCAL_EXPORT_LDFLAGS

该变量作用同LOCAL_EXPORT_CFLAGS,只不过是针对linker flags

LOCAL_EXPORT_LDLIBS

该变量告诉系统传递指定的的系统库给编译器,系统会添加导入的的连接属性给LOCAL_LDLIBS,例如:

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

 

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

系统会在编译libbar.so时将-llog放在连接命令行末端

LOCAL_SHORT_COMMANDS

当你的模块中有大量源文件或依赖库时,可以将此变量设为true,之后系统会使用@语法来直接包含对象文件或二进制文件,这个特性在Windows会有用,也可以在Application.mk中定义APP_SHORT_COMMANDS来为每个模块开启这一属性

LOCAL_THIN_ARCHIVE

构建静态库时,可以将此变量设为true,系统会产生一个'瘦身了的archive文件',在该库文件中并不包含对象文件,而只是包含每个对象文件对应的路径

my-dir

这个宏返回最后一个makefile的路径,一般都是当前Android.mk的路径,这个宏一般用来在Android.mk开头定义LOCAL_PATH变量,例如:

LOCAL_PATH := $(call my-dir)

 

all-subdir-makefiles

返回当前my-dir路径下所有子目录的所有Android.mk

this-makefile

返回当前makefile的路径

parent-makefile

返回包含当前makefile的父makefile的路径

grand-parent-makefile

返回包含当前makefile的祖父makefile的路径

import-module

可以用来包含一个指定模块的Android.mk,用法是:

$(call import-module,<name>)

 

  
  
  

 

Android NDK——源码编译脚本之Makefile 基础语法和Android.mk小结 `Android.mk编译脚本`是用于向Android NDK描述你想让NDK使用那些C、C++源代码文件来构建你的产物。一个Android.mk 文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。 阅读详情

相关推荐

AndroidStudio生成安卓共享库(sharedlibrary)

背景 因工作需要,想要在提供一种能力,供三方apk进行调用,通常的解决方式就是通过提供aar给到三方apk进行继承。但是这样的方式就会有一个明显的缺陷,就是在资源文件众多的时候,aar文件会变得非常大,进而导致三方apk的包体变大。这样显然是不利于三方进行接入,并且在多个apk集成后,同样的内容在同一个系统中打包了多份,这显然也不是我们想要的。这个时候,shared-library就十分符合我们的诉求。 网上搜索了半天,关于sharedlibrary实在是少之又少,因此经过一番周折以后,我觉得有必要..

至淡以消忮心 5564

Android.mk使用简介(以PREBUILT_SHARED_LIBRARY和BUILD_SHARED_LIBRARY扩展描述)

用来指定一个预先已经编译好的动态库,与BUILD_SAHRED_LIBRARY和BUILD_STATIC_LIBRARY不同,该模块对应的LOCAL_SRC_FILES不能是源文件,而只能是一个已经编译好的的动态库的路径,如foo/libfoo.so。该变量指向一个构建脚本并收集所有通过LOCAL_XXX变量指定的关于当前模块的信息,并根据你所列出的源文件构建一个动态库(.so)使用该变量前,你应该至少定义了LOCAL_MODULE和LOCAL_SRC_FILES。包含了构建该模块的源文件列表。

格物致知的专栏 [音视频编解码 网络协议 计算机视觉 计算机图形学 图像理解 语音识别 机器学习 模拟电路 传感器] 2711

Android.mk--编译Android的模块

Android中的各种模块,无论是APK应用、可执行程序还是jar包,都可以通过Build系统编译生成。在每一个模块的源码目录下,都有一个Android.mk文件,里面包含了模块代码的位置、模块的名称、需要链接的动态库等一系列的定义。

Kitty_Landon的专栏 5664

CMake 之 BUILD_SHARED_LIBS 和 CMAKE_BUILD_TYPE 用法教程

推荐使用add_library()时不指定STATIC|SHARED,而是由BUILD_SHARED_LIBS变量来控制。同时又通过自定义宏来决定,生成的.dll是采用或。这部分,以及结合如何使用.dll后面单独详细讲解一篇。本篇对应的修改源码在此。......

1万+

Android JNI学习笔记(三)-编译文件Android.mk、Application.mk 与camke

1. 前言在android2.2中,加入了cmake编译,而以前都是用Android.mk、Application.mk的,今天就来记录下,他们的配置选项。2. Android.mkAndroid.mk在jni目录下,用于描述构建系统的源文件以及 shared libraries 。文件格式如下: 以LOCAL_PATH变量开始 LOCAL_PATH := $(call my-dir) 紧接着是C

_StriveG的专栏 1万+

麦克斯韦电磁场理论

1)从知识先后上说:麦克斯韦方程组为理解光的传播、反射、折射等现象提供了理论基础。不理解基础,怎么能理解上层建筑。2)从如何学懂上说,把基础学习的越牢,越深刻,后续学习上层建筑就会水到渠成一些,不会越学越多疑问。而是越学越少疑问。

weixin_55255438的博客 2826

Android怎么prebuilt预制动态库和静态库

    Android.bp和Android.mk怎么预制so 引言   关于Android相关的源码和技术分析博客,停更有蛮久的了。因为一直忙于新的工作和新知识点的学习当中!当然药不能停,错了博客不能停!正好今天偷得一会闲,也恰好有个小伙伴咨询在Android高版本上面(R Q)上面怎么进行预制已经编译好的so。当时就简单的给小伙伴答复了下,这里就简单的安排总结一下,所以没有啥矫揉造作的,直接开干就是了。 重要的事情说三遍,重要的事情说三遍,重要的事情说三遍!这里的所说的预制不是简单的把so库简单拷贝

IT先森 1万+

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 302

Android.mk语法详解

目前 Android 工程可以通过 mk、或者 cmake 的形式构建 NDK 工程,较新的 Android 工程一般采用的是 .cmake 构建 NDK 源码,而相对创建时间久的工程则大多数采用的是 .mk 的形式构建。文章主要是通过解析 Android 源码里的 docs 文档来深入了解 .mk 语法,其中会对原文里面一些描述通过实际工程加以描述。

Bai HongHua的博客 7556

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 446

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南

本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。

weixin_29278805的博客 523

Android.mk构建一个模块

在Android系统开发中,Android.mk是一个非常关键的文件,它用于定义如何构建一个模块,无论是库、可执行文件还是应用程序。这个文件通常位于项目的某个子目录中,为ndk-build或Android的构建系统提供必要的构建指令。

酌沧 1557

【Bug已解决】[Bug]: ValueError: No user query found in messages QWEN 3.5 27B VLLM 0.16.0 NIGHTLY 解决方案

用 vLLM 0.16.0 nightly 给发聊天请求时,服务端在处理消息时抛ValueError,请求失败。

博客 412

Android.mk和Application.mk文件使用整理总结

1.Android.mk文件 1.简介: Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU Makefile的一部分,且将被Build System解析一次或多次。所以,请尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。Android.mk文件语法允许我们将Source打包成一个"modules"...

paradox_1_0的博客 2245

问题解答:如何不通过修改底层数据库表的方式,给数据库对应的数据结构,增添新的字段?

现在需要将这张表里的内容读取到 ABAP 内表里,并且针对每个行项目,增加一个新的列字段,我随便举个例子,这个列字段名称叫 LENGTH,值为 OBJ_NAME 字段的长度,使用。最笨的办法就是下面这样定义一个新的类型,这个类型的每个字段名称,都来自数据库表 TADIR 的同名字段,在末尾再增添自定义字段 length.其实我们是做 ALV 输出,只需要 ABAP 内表变量的类型,包含 TADIR 数据库表的全部字段,再加上新的 LENGTH 字段即可。这相当于多了一个中间层,没办法直接被 ALV 处理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 482

MATLAB基础应用精讲-【数模应用】游程检验(附MATLAB、R语言和python代码实现)

游程检验是一种非参数性统计假设的检验方法,它是游程总数检验和最大游程检验的总称,用于两个独立样本的比较和观测结果随机性的检验测试。​游程检验亦称“连贯检验”,是根据样本标志表现排列所形成的游程的多少进行判断的检验方法。[2]例1:设某样本n=12人的标志表现为男、女,有以下三种排列。(i) 男\男,女\女\女,男,女\女,男\男\男\男;(ii) 男\男\男\男\男\男\男,女\女\女\女\女;(iii) 男,女,男,女,男,女,男,女,男,女,男\男;连续出现男或女的区段称为游程。

qq_36130719的博客 609

解读Android.mk文件

一、介绍 本文章会介绍构建 Android.mk文件的构建过程;Android.mk文件会将我们的 C 和 C++ 文件描述为 Android NDK 二、概述 Android.mk文件是描述源文件在构建系统的作用,更具体来说: 这个Android.mk是一个微小版的在构建过程中解析一次或多次的Makefile,最好尽量减少在这个文件中声明变量的数量,不要使用没有定义的变量 它可...

ytempest的博客 5517

AI原生应用API编排:如何实现高效的权限管理?

随着GPT-4、Claude 3等大模型的普及,AI原生应用(从设计之初就以AI为核心的应用)正从“概念”走向“落地”。依赖大量外部API的协同工作(如用户身份API→大模型生成API→支付API→存储API)。但随之而来的挑战是:如何在复杂的API调用链中,确保每个环节的权限合规?本文将聚焦这一问题,覆盖API编排的基础逻辑、权限管理的核心机制(如RBAC/ABAC)、实战工具链(如OPA策略引擎),以及常见场景的解决方案。本文将按照“场景引入→核心概念→原理拆解→实战演练→趋势展望”的逻辑展开。

大数据洞察的博客 452

【android】Android.mk的文件梳理

1.android.mk的简要概述 一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块。每个模块属下列类型之一: 1)APK程序,一般的Android程序,编译打包生成apk文件 2)Java库,java类库,编译打包生成ja

Felaim的博客 945

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android.mk简单介绍、规则与基本格式

Android.mk简单介绍、规则与基本格式。Android.mk与makefile区别;Android.mk规则;Android.mk基本格式。

Chasing Freedom 1168

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android mk方式使用动态库和静态库

centos ndk下载和编译动态库 静态库 Mac使用iTerm2 rz sz和腾讯云互传文件 将libget.a 和 libget.so 添加到ndkdir目录中,并创建Android.mk文件 配置build.gradle externalNativeBuild { ndkBuild { abiFilters 'armeabi-...

hongxue8888的博客 3908

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android.mk 介绍,Android_mk简介

一. Android.mk介绍Android.mk是Android提供的一种makefile文件,是GNU Makefile的一小部分,用来对Android程序进行编译,指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件;因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变量都是全局的。因此,您应尽量少声明变量,...

weixin_31600305的博客 587

Android mk 简介

本文参考:https://www.cnblogs.com/wainiwann/p/3837936.html

WillScorpio 729

android.mk自定义变量,Android.mk内的变量定义

Android.mk的变量一.自定义变量:在Android.mk文件中自定义变量要遵守以下规则:1.不能以LOCAL_开头(例如:LOCAL_path);2.不能以PRIVATE_、NDK_、APP_开头3.不能全用小写字母(例如:my-dir)4.建议使用MY_前缀的自定义变量5.最重要是不能与NDK编译系统保留的变量名一样。二.NDK编译系统保留的变量及其介绍:1.CLEAR_VARS指出了编...

weixin_34205814的博客 1652

Android.mk和Application.mk基本内容

目录 android.mk Android.mk 文件所含内容的基本信息 变量和宏 模块描述变量 application.mk ndk-build 认识Android.mk和Application.mk android.mk Andr...

weixin_34124651的博客 191
上一篇: 编译与预编译的区别(以typedef和define为例)
下一篇: Windows环境变量设置后立即生效——方法总结
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值