Android-NDK学习(30%)
2018-03-19 21:53:14 7 举报
AI智能生成
Google开发者----->NDK学习流程以及基本概念汇总.
作者其他创作
大纲/内容
Getting Started
Concepts(概念内容)
简介
Android NDK是一组允许将C或者C++嵌入到Androdi应用的工具
- 在平台之间移值应用
- 重复使用现有库,提供自己的库供重复使用
- 提高性能,特别是游戏计算密集应用
工作方式
主要组件
ndk-build:ndk-build启动构建脚本
- 自动识别开发系统,项目文件,要构建的内容
- 生成目的二进制文件
- 复制生成二进制到目的位置
java:Android构建过程从java源代码生成.dex(Dalvlik EXecutable)文件,运行在Android OS在Dalvik虚拟机(DVM)中.
- 在Java源码中,使用native关键字指以原生(C或者C++)代码实现方法例如: public native int add(int x,int y );
原生共享库:NDK 从原生代码构建这些库或者.so文件
注意:两个库不可使用相同的签名(签名指方法名称)
注意:两个库不可使用相同的签名(签名指方法名称)
原生静态库:NDK也可以构建静态库或.a文件
Java原生接口(JNI):JNI是Java和C++组件进行互相沟通的接口
应用二进制界面(ABI):精确定义应用的机器代码如何与系统交互,NDK根据定义构建.so文件
ndk构建脚本
Android.mk:必须在jni文件夹内存在,ndk-build查看Android.mk文件,定义模块名称,目的编译源文件 版本标志 链接的库
Application.mk:枚举并描述应用需要的模块
- 针对特定平台编译ABI
- 工具链(?)
- 包含的标准库(静态和动态STLport或者默认系统)
流程
原生Activity 和应用
JNI Tips
JNI is the java native interface,It define a way for the bytecode that Android compiles from managed code(Written in the Java or Kotlin programming language)to interact(相互作用) withe native (Writen in C/C++)
Building
Android.mk
概览:位于项目jni/目录的子目录中,向构建系统描述源文件和共享片段.实际是构建系统解析一次或者多次的微小GNU makefile片段.
概览:Android.mk文件位于jni/目录的子目录中,用于向构建系统描述源文件和共享库.Android.mk的语法将源文件分为多个模块.模块是静态库,共享库,或者独立文件.可以在Android.mk中定义一个模快或者多个模块.多个模块也可以使用同一个文件.构建系统只会把共享库放入应用软件包.静态库也可以生成共享库.
基本知识:
- LOCAL_PATH := $(call my-dir) 源文件在开发树中的位置,提供函数my-dir返回当前目录(包含Android.mk的路径)
- include $(CLEAR_VARS) 指向特殊的GNU Makefile,清楚LOCAL_xxx,例如:LOCAL_MODULE LOCAL_SRC_FILES LOCAL_STATIC_LIBRARIES,但是不会移出LOCAL_PATH.
- LOCAL_MODULE 存储构建的模块的名称.例如:LOCAL_MODULE := hello-jni 模块名称必须唯一,且不含任何空格.最终生成 libhello-jni.so共享库
- LOCAL_SRC_FILE 包含要构建的模块中的C和C++源文件列表
- include $(BUILD_SHARED_LIBRARY) 帮助系统把所有内容连接在一起.用于收集在include后的LCOAL_XXX中定义的所信息.
变量和宏
NDK构建系统预留一下变量名称:
LOCAL_
PRIVATE_ NDK_ 或 APP开头 构建系统内部使用这些变量
小写名称 my-dir 构建系统内部使用这些变量
为了方便在Android.mk文件定义自己的变量,建议名称前附加MY_
NDK构建系统预留一下变量名称:
LOCAL_
PRIVATE_ NDK_ 或 APP开头 构建系统内部使用这些变量
小写名称 my-dir 构建系统内部使用这些变量
为了方便在Android.mk文件定义自己的变量,建议名称前附加MY_
NDK定义的变量(本机讨论系统在解析Android.mk文件时之前定义的GNU Make变量):
- CLEAR_VARS :用法 include $(CLEAR_VARS)
- BUILD_SHARED_LIBRARY(收集在LOCAL_XXX变量提供的相关信息,以及确定如何从列出的元源文件构建标准共享库):用法 include $(BUILD_SHARED_LIBRARY)
- BUILD_STATIC_LIBRARY (构建系统不会将静态库复制到您的项目或者软件包,但是可以使用他们构建共享库):用法 include $(BUILD_STATIC_LIBRARY,静态库变量导致构建系统扩展平为.a库)
- PREBUILT_SHARED_LIBRARY
模块描述变量
NDK提供的函数宏
my-dir:返回最后包含makefile的路径,通常是Android.mk的目录
all-subdir-makefiles:返回当前my-dir路径下所有子目录的Android.mk文件列表
this-makefile:返回当前makefile(构建系统从中调用的函数)的路径
parent-makefile:返回包含树父makefile的路径
import-module:按照模块名称查找包含Android.mk的文件路径
例如:$(call import-module,<name>)
例如:$(call import-module,<name>)
Application.mk
概览:描述应用需要的原生模块.模块可以是静态库,共享库,可执行文件.定义要编译的多个GNU Makefile片段.位于$PROJECT/jni/
变量如下:
变量如下:
APP_PROJECT_PATH:用于存储应用项目的根目录的绝对路径
APP_OPTIM:release或者debug
APP_CFLASS:存储构建系统为任何模块编译C或者C++传递到编译器的一组C编译标志.
APP_STL
APP_SHORT_COMMANDS
NDK_TOOLCHAIN_VERSION
APP_PIE
APP_THIN_ARCHIVE
APP_PLATFORM
APP_ABI
APP_BUILD_SCRIPT
APP_LDFLAGS
nkd-build
概览:ndk-build文件是Android NDK r4中引入的一个shell脚本
内部构建:运行ndk-build
- GNUMAKE -f <ndk>/build/core/build-local.mk <parameters>
- GNUMAKE 指向GNU Make 3.81或者更新版本
- <ndk>执行安装目录
从命令行调用
ndk-build文件位于NDK安装目录的顶层.请在应用的目录中或者子目录调用
例如: cd <project> <ndk>/ndk-build
<project>指向项目的根目录
<ndk>指向您安装的NDK的目录
ndk-build文件位于NDK安装目录的顶层.请在应用的目录中或者子目录调用
例如: cd <project> <ndk>/ndk-build
<project>指向项目的根目录
<ndk>指向您安装的NDK的目录
64位工具链和32位工具链
ndk脚本会自动选择工具链的版本
通过NDK_HOST_32BIT=1强制使用32位工具链
ndk脚本会自动选择工具链的版本
通过NDK_HOST_32BIT=1强制使用32位工具链
CMake
Using Android Stduio 2.2 and higher,your can use the NDK and CMake to compile C and C++ code into a native library.
Using CMake variables in Gradle
Understanding the CMake build command
YASM support in CMake
Standalone Toolchain
Architechtures and CPUs
CPU和架构,使用原声代码时,硬件很重要.NDK提供各种ABI选择.
ABI Management
NEON
x86
x86-64
The cpufeatures Library
Libraries
使用自己的以及NDK提供的现有库
Prebuild Libraries
C++ Support
Native APIs
High-Performance Audio
Vulkan
Machine Learing

收藏
0 条评论
下一页