Android NDK 编译原理

NDK是什么?有什么用?需要掌握什么技术栈? LLDB是一个高性能的调试器,它可以用于调试多种平台和语言,包括C / C ++,Objective-C,Swift和Assembly。需要注意的是,虽然使用 NDK 可以为应用程序带来更好的性能和更高的灵活性,但同时也增加了应用程序的开发和维护成本。有时候,拿到C/C++的代码会有各种各样的问题,例如代码是针对32系统编写的,我们要移植到64位系统运行可能就会出问题。很灵活和强大的构建工具,需要掌握CMake的使用,才能根据不同的源代码环境对代码进行正确的构建。这是掌握NDK必不可少的技术栈。 阅读详情

一、gradle

gradle是Android Studio指定的自动编译脚本,它有点像 Linux C开发中的 Makefile。下面我来看下 Android Studio 是如何使用 Gradle 的。

在 Android 项目中,包括三个 gradle 文件, 它分分别是:

  • build.gradle是Android 项目的顶级脚本;
  • setting.gradle里记录了 Android 项目里都包括了哪些子项目;
  • app/build.gradle里记录了每个子模块应该如何进行编译。
     

下面我们详细介绍一下每个文件的作用。

1、build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这个文件是整个项目的gradle基础配置文件,默认有三个“节点”,分别是 buildscript、allprojects 和 task clean。

  • buildscript下的第一个子节点”repositories”是声明仓库源,默认是jcenter。jcenter可以理解成是一个新的中央远程仓库。第二个子节点是dependencies声明Android gradle plugin的版本。
  • allprojects下是声明了所有project默认的仓库源。
  • task clean声明了一个叫clean的作务,该任务类型是Delete(也可以是Copy),就是每当修改settings.gradle文件后点击同步,就会删除rootProject.buildDir下的文件。

注意 :我们看到 allprojects 中也同样声明了jcenter,它是不是与buildscript重复了呢?其实allprojects中设置的jcenter作用域与buildscript是完全不一样的,allprojects设置的是project默认的仓库源,buildscript设置的是gradle使用的源。

2、setting.gradle

include ':app'

如果在project里添加了子项目(Module),按理需要在settings.gradle里添加相应子项目名称。

3、app/build.gradle

//声名使用的是 android gradle 插件
apply plugin: 'com.android.application'

android {
    //编译 SDK 我本号
    compileSdkVersion 24
    //build 工具版本号 
    buildToolsVersion "25.0.0"
    //默认配置参数
    defaultConfig {
        //应用的包名
        applicationId "com.example.garrylea.testjni"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            //是否进行混淆
            minifyEnabled false
            // 混淆文件的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //编译libs目录下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

这里需要说明几点:

  • apply plugin: 指明 gradle wrapper应该使用那个 gradle 插件。一般情况下我们都应该使用 android 插件。
  • buildToolsVersion: 指明你本地安装的 build tools 版本。很多人导入新的第三方库,失败的原因之一是build version的版本不对导致的。可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。
  • applicationId: 代表应用的包名。

二、交叉编译

由于目标环境中各种资源都相对有限,所以很难直接进行本地编译,所以需要交叉编译。

交叉工具链是指可以生成目标环境可运行代码的工具集。我们知道,在Linux系统中的编译工具链包括以下一些工具, 编译器gcc, 链接器ld, 归档工具ar等等,如果在 Linux 环境中交叉编译 Android 系统环境可运行的代码,是不能直接使用Linux下的编译工具的,而应该使用 Android NDK 里的工具链,它们对应的名子为 arm-linux-android-gcc, arm-linux-android-ld等等。
交叉编译工具的命名规则 arch-[vendor]-kernel-system-toolname。它由五部分组成,下面分别解释一下每部分的含义:

arch,指的是CPU架构, 一般包括如下几种架构: arm, mips, powerpc, x86, x86_64。
verdor, 一般指的是生产厂商, 如果没有生产厂商可以为空。
kernel, 指的目标环境使用的 kernel,以android为例,它使用的是 linux内核,所以在这部分会填写为linux。
system, 指的是那个系统, 如androideabi, android
toolname: 指的是 gcc, ld, ar等。

所以我们可以看到 android 的编译工具的名子会写成 arm-linux-andirod-gcc。

在做交叉编译时,我们常会在脚本中定义一些环境变量以方便我们命名用,常用的环境变量如下:

PREFIX: 指明交叉编译后输出的目录。
ARCH: 指明交叉编译后输出的CPU架构。
CROSS-PREFIX:指明交叉编译前辍 arch-vender-kernel-system
SYSROOT: 指明交叉编译目标机器的头文件和库文件目录
TOOLCHAIN: 指明交叉编译工具链的位置。
PLATFROM: 指明交叉编译时使用的是哪个版本的的头文件和库文件。它是 SYSROOT的一部分。
ANDROID_NDK: 指明 Android NDK 所在目录。

举例,以ffmpeg的交叉编译为例,我们可以来看一下如果生成交叉编译的Makefile。

通过设置configure 参数来生成交叉编译的 Makefile 文件
—arch 指定架构
—cross-prefix 交叉编译工具链前辍
—sys root 交叉编译树的根

./configure –target-os=linux –arch=arm –enable-cross-compile –cross-prefix=arm-linux-androideabi- –sysroot=~Library/Android/sdk/ndk-bundle/platforms/android-9/arch-arm
执行后的结果如下:

install prefix            /usr/local
source path               .
C compiler                arm-linux-androideabi-gcc
C library                 bionic
host C compiler           gcc
host C library            
ARCH                      arm (armv5te)

三、NDK编译环境

上面的方式比较原始,技术门槛稍高,对之前没有做过嵌入式开发的同学来说难度还是蛮大的。

为了解决这个问题,Google 提供了一系列脚本工具,以方便大家做 Android NDK方面的开发,其中最重要的是 ndk-build 脚本。有了这些脚本,开发者就不必再定义各种环境变量,只需要提供两个 Makefile 片段指明要编译哪些C/C++文件,生成哪个目标环境的程序就好了。 ndk-build脚本工具会自动检测各种环境变量、目标环境编译器等,最终完成交叉编译。
先让我们来看一下 ndk-build 吧。通过查看ndk-build源码我们可以看到,它执行的是类似于 $GNUMAKE -f /build/core/build-local.mk 这样的命令,实际就是自动检测并设置环境变量。我执行 ndk-build NDK_LOG=1 命令,会看到下面的信息:

Android NDK: NDK installation path auto-detected: 
Android NDK: GNU Make version 3.81 detected
Android NDK: Host OS was auto-detected: darwin
Android NDK: Host operating system detected: darwin
Android NDK: Host CPU was auto-detected: x86
Android NDK: HOST_TAG set to darwin-x86
Android NDK: Host tools prebuilt directory: 
**#这里检测到编译器地址**
~/Library/Android/sdk/ndk-bundle/prebuilt/darwin-x86_64/bin 
Android NDK: Found platform root directory: 
**#这里检测到 platforms 目录地址** 
~/Library/Android/sdk/ndk-bundle/platforms 
**#下面列出了所有支持的 platform**
Android NDK: Found supported platforms: android-12 android-13 android-14 android-15 android-16 android-17 android-18 android-19 android-21 android-22 android-23 android-24 android-26 android-9 
**#列出支持的目标环境** 
Android NDK: PLATFORM android-12 supports: arm mips x86 
**#下面是每个目标环境的的环境树**
Android NDK:   ABI arm sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-arm
Android NDK:   ABI mips sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-mips
Android NDK:   ABI x86 sysroot is: /Users/lichao/Library/Android/sdk/ndk-bundle/platforms/android-12/arch-x86 

通过上面的分析我们应该已经很清楚 ndk-build 主要作什么事情了。既然 Google已经给我们提供了这么方便的交叉编译工具,那作为开发者我们还需要做哪些事情呢?
作为开发者的我们还需要做下面两件事儿:

  • 编写 C/C++ 代码。
  • 编写 Android.mk 和 Application.mk 两个 Makefile 片段。

下面我们就来看一下两个Makefile片段 Android.mk 和 Application.mk 是做什么用的。

  • Android.mk: 目的是用于向构建系统描述源文件和共享库,它位于 $PROJECT/ni/目录中。
  • Application.mk: 目的是描述在你的应用程序中所需要的模块(即静态库或动态库),它也位于 $PROJECT/jni/ 目录中。

首先我们先来看一下 Android.mk的例子:

LOCAL_PATH       :=  $(call my-dir)
include              $(CLEAR_VARS)
LOCAL_MODULE     :=  hello_jni
LOCAL_SRC_FILES  :=  hello_jni.c
include              $(BUILD_SHARED_LIBRARY)

  • 在Android.mk中必须首先定义 LOCAL_PATH 变量,此变量表示源文件在开发树中的位置。构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径。
  • CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量,例如 LOCAL_MODULE、LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES。 请注意,它不会清除 LOCAL_PATH。此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。
  • LOCAL_MODULE 变量将存储您要构建的模块的名称
  • LOCAL_SRC_FILES 枚举源文件,以空格分隔多个文件。LOCAL_SRC_FILES 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表。
  • 最后一行帮助系统将所有内容连接到一起。

我们再来看一下Application.mk的例子:

APP_PLATFORM := android-9
APP_STL      := gnustl_static
APP_CFLAGS   := -Wno-error=format-security
APP_ABI      := armeabi armeabi-v7a arm64-v8a
APP_OPTION   := release

APP_PLATFORM 变量包含目标 Android 平台的名称。NDK API 级别与 Android 版本对照表如下:

NDK 支持的 API 级别Android 版本
92.3 到 3.0.x
123.1.x
133.2
144.0 到 4.0.2
154.0.3 和 4.0.4
164.1 和 4.1.1
174.2 和 4.2.2
184.3
194.4
214.4W 和 5.0

APP_STL      默认情况下,NDK 构建系统为 Android 系统提供的最小 C++ 运行时库 (system/lib/libstdc++.so) 。 该指令可以让您在自己的应用中使用或链接的替代 C++ 实现。

APP_CFLAGS构建系统在仅构建 C++ 源文件时传递到编译器的一组 C++ 编译器标志。

您可以使用 APP_ABI 选择编译出不同的 ABI 目标环境代码。

可定义变量为 release 或 debug。在构建应用的模块时可使用它来更改优化级别。

 

 

 

 

adt bundle自带eclipse的NDK配置 eclipse可以通过在菜单栏window-preferences-android-NDK配置NDK。 但是adt bundle中自带的eclipse没有NDK选项,原因是缺少一个包: com.android.ide.eclipse.ndk_23.0.2.1259578.jar 将这个包放在eclipse的plugins文件夹下,重启eclipse,就可以看到NDK的选项了。 立即下载

相关推荐

ctx->cvdl->cuvidGetDecoderCaps(&ctx->caps8) failed -> CUDA_ERROR_DEINITIALIZED: driver shutting down

ffplay -vcodec h264_cuvid sample_720p-2.h264 [quantum6@freeswitch freeswitch]$ ffplay -vcodec h264_cuvid sample_720p-2.h264 ffplay version 4.3.1 Copyright (c) 2003-2020 the FFmpeg developers built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44) .

柳鲲鹏 2406

Android:NDK编译

使用NDK可以编译出静态(.a)、动态(.so)链接库和可执行文件 比在工程环境里写mk或者bp要方便很多 一段时间不用NDK编译容易忘记怎么使用,所以用一个小的"Hello NDK"示例记录NDK编译的基本过程

肖云鹤的博客 2472

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3890

NDK开发之编译原理与语法

1.编译流程 编译就是将高级语言的代码转化成可执行的二进制目标代码。主要包含四个步骤:预处理、编译、汇编、链接。 预处理:就是对各种预处理命令的处理,主要是宏替换、文件引入、去除空行和注释等。linux系统中预处理命令:gcc -E test.c -o test.i。-E表示gcc在预处理后停止编译、汇编和链接操作。 编译:将预处理后的代码翻译成汇编语言。会先分析后综合,分析就是进行词法、语...

awsaawsy的博客 653

大数据NiFi(十一):NiFi入门案例一

注意:数据写出的目录可以不需要提前在对应节点上创建,默认是可以自动创建,可以通过“Create Missing Directories”属性配置。将输出文件的权限设置为此属性的值,格式必须是UNIX rwxrwxrwx,用-来代替被拒绝的权限(例如rw-r--r--)或八进制数字(例如644),可以使用表达式,例如${file.permissions}。这里需要使用到的处理器是“GetFile”和“PutFile”,完成以上需求对“GetFile”和“PutFile”相关属性进行配置。

Lansonli(蓝深李)的博客 1490

【BUG已解决】pip install 出现 error: Microsoft Visual C++ 14.0 or greater is required 解决方案

方案磁盘占用适用场景推荐指数安装Build Tools3-6GB长期Windows Python开发⭐⭐⭐⭐⭐寻找预编译wheel无额外占用只是想快速装上某个包⭐⭐⭐⭐⭐用conda安装视包而定已经在用conda环境⭐⭐⭐⭐⭐升级到新版本无额外占用库本身有更新的预编译版本⭐⭐⭐⭐使用WSL2需要额外配置Linux子系统频繁遇到Windows编译问题⭐⭐⭐⭐的核心是Windows 缺少本地 C/C++ 编译器,而目标包需要在本机编译。先看是否有捷径。

博客 1万+

Android NDK开发,使用ndk-build编译,写的太详细了

项目或者应用的包名:com.ang.ndkdemo public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //创建的本地方法,具体功能在C或者C++中实现 public nat

m0_64319064的博客 2731

FastGPT智能体开发:FastGPT OpenAPI 知识库接口

FastGPT OpenAPI 知识库接口

王国平的博客 323

Android NDK开发(一)——ndk-build编译生成so库文件并使用

JNI简介 JNI(Java Native Interface),是方便Java调用C/C++等Native代码封装的一层接口。 NDK简介 NDK(Native Development Kit),是Android提供的一套工具集合,通过NDK可以在Android中更加方便的通过JNI开访问本地代码。NDK提供了交叉编译,开发人员只需要简单的修改mk文件就可以生成特定CPU平台的动态库。使用...

zoujin6649的博客 1万+

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

FortiOS 是 Fortinet 公司开发的操作系统,作为 Fortinet 安全平台的核心,提供全面的网络安全功能。 它将网络和安全功能无缝集成,支持跨本地、云、混合和融合 IT/OT/IoT 基础设施环境的统一管理。 FortiOS 7.6 版本引入了生成式人工智能助手、数据保护、托管服务和单一代理等新功能,进一步增强了其安全性和性能。

缘梦未来的博客 1842

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 462

Android NDK编译原理

前言 做Android APP开发,可以基本不用care java的编译过程,java的依赖关系,并且现在Android studio也已经支持了cmake开发,也就是说大部分情况下,就不用关心系统是如何编译的,不过对于想要用以一些第三方库,这就需要对整个编译框架有所了解了,并且这个东东还是很简单的。 正文 Android APP jni 编译控制有四种主要的编译控制系统, Andr...

白嫩豆腐 1377

数字人(对嘴型 Lip-sync)数据集 LRS2 介绍(含网盘链接)

LRS2(Lip Reading Sentences 2)是牛津大学与BBC合作开发的一个大规模唇语识别数据集,专门用于训练和评估数字人唇语同步(Lip-sync)技术。该数据集包含数千条来自BBC电视节目的口语句子,每个句子长度最多100个字符。官方网站为:https://www.robots.ox.ac.uk/~vgg/data/lip_reading/lrs2.html可惜需要认证,不过我已经下载好并存到网盘里了,有需要可适用如下链接下载。(仅供学习,请勿传播)

iioSnail的博客 1687

(转)NDK Android程序编译原理之浅析

感谢原文作者的总结,地址如下: http://blog.youkuaiyun.com/nodeathphoenix/article/details/7684230   Android build/core下的编译脚本里会用到变量NDK_ROOT和NDK_PROJECT_PATH。但是这两个变量你都不是必须显式地设置对应环境变量。因为如果没有定义NDK_ROOT,脚本里拿字符串"build/core"去...

jameskaron的专栏 185

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

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android-NDK-11-C语言编译原理

############################# 编译的原理 编译(把人写的代码,变成,机器可以认识的指令) Linux(gcc),Mac(Clang) 1.预处理阶段(include,宏 ....) gcc -E A.c -o A.i 2.编译阶段,编译之后(汇编代码) gcc -S A.i -o A.s 3.汇编处理阶段,把汇编代码处理成,计算机认识01010101机器码 gcc -c A.s -o A.o 4.链接阶段,打出可以执行的 gcc -C A.o -o A ...

qq_23956889的博客 348

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

使用安卓NDK 交叉编译动态库、静态库基础入门

本篇博客将详细介绍如何在 Windows 环境下使用 Android NDK 交叉编译 C 文件,生成静态和动态库,并在 Android 项目中使用这些库。编译器概述特点GNU项目开发的编译器集合,支持多种编程语言,包括C、C++、Fortran等。开源免费:遵循GPL许可,广泛应用于开源项目。跨平台支持:支持Linux、Windows、macOS等多种操作系统和硬件架构。强大的优化能力:提供多种优化选项,生成高效的目标代码。G++GCC中的C++编译器驱动程序,专门用于编译C++源代码。

WriteBug001的博客 2309

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android高级-NDK-C++编译原理与语法详解

1:编译流程: 编译范围四大过程: 1:预处理 2:编译 3:汇编 4:链接 1:预处理 1 完成宏替换,文件引入,以及去除空行,注释等,为下一步的编译做准备 2 也就是堆各种预处理命令进行处理,包括头文件的包含,宏定义的扩展,条件编译的选择等 编译流程: 2:编译: 1 将预处理后的代码编译成汇编代码,在这个阶段中没首先要检查diama...

u013815832的博客 515

Android Hook技术学习——常见的hook技术方案

hook

QG 2171

Android.mk 介绍

原文地址:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/13/2137577.html 工作需要,最近在看Android NDK编译相关的一些内容。 会把看到的比较好的文章转载一下,方便以后查阅。遇到特别的问题我自己也会整理记录,但大家的文章都写的很用心,我也争取把问题描述清楚,过程陈述明白,如果能追究到底层原因并说清楚的话那再

流鼻涕的猪 444

从源码到APK:FFmpeg-Android的编译原理与自定义构建指南

FFmpeg-Android是一个为Android平台预编译FFmpeg和FFprobe的开源项目,让开发者能够在Android应用中轻松执行多媒体处理命令。本文将深入解析FFmpeg-Android的编译原理,并提供完整的自定义构建指南,帮助您从源码到APK的完整流程。 ## 🔍 FFmpeg-Android项目架构解析 FFmpeg-Android项目采用模块化设计,主要包含两个核心模块

gitblog_00202的博客 499

Cocos2d-x移植到Android平台编译的两个文件Android.mk和Application.mk

https://blog.youkuaiyun.com/wwj_748/article/details/300559152014年6月11日 本篇博客主要讲NDK编译Android项目的两个文件Android.mk和Application.mk,笔者在使用NDK编译Cocos2d-x生成的Android项目的时候遇到配置编译环境的问题,网上虽然有些配置教程,但并未把一些原理性的东西描述清楚,虽然有时候可以把编...

北极洲的博客 293

Android Native Development

Android Native Development 介绍 Android Native开发就是指是使用C和C++等语言以原生代码形式,来实现应用的各个部分。而Android是基于Linux内核的操作系统,因此在Android上使用C/C++开发和Linux非常类似。本系列文章主要介绍C/C++程序编译、运行、调试等相关知识,会从Linux和Android两个平台同时对比分析。 使用Gitbook提供更加友好的阅读体验: GitHub Pages 地址:https://chenls.github.io/An

陈六生的博客 451

Xshell 基础命令及其打包静态库和动态库命令

open ------- 打开链接服务器 clear------------清屏 ls ----------查看文件目录 ls -all --------查看所有的文件目录 rm -rf name -------删除文件 rm -rf ./ -------删除全部 wget 网址 --------- 下载别的东西到服务器 rz ------...

flying0916的博客 1445

常见的Hook技术方案总结

本文为看雪论坛精华文章看雪论坛作者ID:随风而行aa一前言最近一段时间在研究Android加壳和脱壳技术,其中涉及到了一些hook技术,于是将自己学习的一些hook技术进行了一下梳理,以便后面回顾和大家学习。本文第二节主要讲述编译原理,了解编译原理可以帮助进一步理解hook技术。本文第三节主要讲述NDK开发的一些基础知识。本文第四节主要讲述各类hook技术的实现原理。本文第五节主要讲述各hook技...

Android技术之家 629

近期要研究的内容

1、回调函数 2、闭包 http://www.w3cschool.cc/js/js-function-closures.html 3、框架,MFC(Microsoft Foundation Classes),MVC(Model View Controller),WPF(Windows Presentation Foundation) 4、设计模式 5、EventQueue i...

a538641097的博客 114

Android 深入系统完全讲解(14)

bp 也是这个目的,而它是 Blueprint 框架解析的,Blueprint 是生成,解析 bp 文件,是 Soong的一部分,而 Soong 是专门编译 Android 系统设计的,最终会转化成 Ninja,我们可以打开生成的 Ninja,去看里面的内容,会是一堆命令,这个就是对应的编译命令。其实要理解这个,需要阅的书籍是编译原理,建议去找一本看看,这样子就知道为什么有这么多参数,其实就是编译,汇编,链接,而每个过程都有一些参数指定,所以就会出现很多配置,编译成什么目标。4 mk bp 文件学习技巧。

程序员入门进阶 583
上一篇: android studio 笔记
下一篇: iOS 编译理解
CopperDong
博客等级 码龄14年 1205粉丝 466原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值