Android-NDK学习(30%)
2018-03-19 21:53:14 7 举报
AI智能生成
Google开发者----->NDK学习流程以及基本概念汇总.
作者其他创作
大纲/内容
Getting Started
Concepts(概念内容)
简介
<font color="#c41230">Android NDK</font>是一组允许将<font color="#c41230">C或者C++嵌入到Androdi应用的工具</font><br><ul><li>在平台之间移值应用<br></li><li>重复使用现有库,提供自己的库供重复使用<br></li><li>提高性能,特别是游戏计算密集应用<br></li></ul>
工作方式
主要组件
<font color="#c41230">ndk-build</font>:ndk-build<font color="#c41230">启动构建脚本</font><br><ul><li>自动识别开发系统,项目文件,要构建的内容<br></li><li>生成目的二进制文件<br></li><li>复制生成二进制到目的位置<br></li></ul>
java:Android构建过程从java源代码生成.<font color="#c41230">dex(Dalvlik EXecutable)</font>文件,运行在<font color="#c41230">Android OS在Dalvik虚拟机(DVM)</font>中.<br><ul><li>在Java源码中,使用native关键字指以原生(C或者C++)代码实现方法例如:<font color="#c41230"> public native int add(int x,int y );</font><br></li></ul>
<font color="#c41230">原生共享库</font>:NDK 从原生代码构建这些库或者<font color="#c41230">.so文件</font><br>注意:两个库不可使用相同的签名(签名指方法名称)
<font color="#c41230">原生静态库</font>:NDK也可以构建静态库或<font color="#c41230">.a文件</font>
Java原生接口(JNI):JNI是Java和C++组件进行互相沟通的接口
应用二进制界面(ABI):精确定义应用的机器代码如何与系统交互,NDK根据定义构建.so文件
ndk构建脚本
Android.mk:必须在jni文件夹内存在,ndk-build查看Android.mk文件,定义<font color="#c41230">模块名称,目的编译源文件 版本标志 链接的库</font>
Application.mk:枚举并描述应用需要的模块<br><ul><li><font color="#c41230">针对特定平台编译ABI<br></font></li><li><font color="#c41230">工具链(?)<br></font></li><li><font color="#c41230">包含的标准库(静态和动态STLport或者默认系统</font>)<br></li></ul>
流程
原生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片段.
<font color="#c41230">概览:</font>Android.mk文件位于jni/目录的子目录中,用于向构建系统描述源文件和共享库.Android.mk的语法将源文件分为多个模块.<font color="#c41230">模块是静态库,共享库,或者独立文件</font>.可<font color="#c41230">以在Android.mk中定义一个模快或者多个模块.多个模块也可以使用同一个文件</font>.构建系统只会把共享库放入应用软件包.静态库也可以生成共享库.
<font color="#c41230">基本知识:</font><br><ol><li>LOCAL_PATH := $(call my-dir) 源文件在开发树中的位置,提供函数my-dir返回当前目录(包含Android.mk的路径)</li><li>include $(CLEAR_VARS) 指向特殊的GNU Makefile,清楚LOCAL_xxx,例如:LOCAL_MODULE LOCAL_SRC_FILES LOCAL_STATIC_LIBRARIES,但是<font color="#c41230">不会移出LOCAL_PATH</font>.</li><li><font color="#c41230">LOCAL_MODULE 存储构建的模块的名称</font>.例如:LOCAL_MODULE := hello-jni 模块名称必须唯一,且不含任何空格.最终生成 libhello-jni.so共享库</li><li><font color="#c41230">LOCAL_SRC_FILE 包含要构建的模块中的C和C++源文件列表</font></li><li><font color="#c41230">include $(BUILD_SHARED_LIBRARY) 帮助系统把所有内容连接在一起.用于收集在include后的LCOAL_XXX中定义的所信息.</font><br></li></ol><br>
变量和宏<br>NDK构建系统预留一下变量名称:<br>LOCAL_ <br>PRIVATE_ NDK_ 或 APP开头 构建系统内部使用这些变量<br>小写名称 my-dir 构建系统内部使用这些变量<br>为了方便在Android.mk文件定义自己的变量,建议名称前附加MY_<br>
NDK定义的变量(本机讨论系统在解析Android.mk文件时之前定义的GNU Make变量):<br><br><ol><li>CLEAR_VARS :用法 include $(CLEAR_VARS)<br></li><li>BUILD_SHARED_LIBRARY(收集在LOCAL_XXX变量提供的相关信息,以及确定如何从列出的元源文件构建标准共享库):用法 include $(BUILD_SHARED_LIBRARY)<br></li><li>BUILD_STATIC_LIBRARY (构建系统不会将静态库复制到您的项目或者软件包,但是可以使用他们构建共享库):用法 include $(BUILD_STATIC_LIBRARY,静态库变量导致构建系统扩展平为.a库)</li><li>PREBUILT_SHARED_LIBRARY<br><br></li></ol>详细配置参数:https://developer.android.google.cn/ndk/guides/android_mk.html<br><br><br>
模块描述变量
NDK提供的函数宏
my-dir:返回最后包含makefile的路径,通常是Android.mk的目录
all-subdir-makefiles:返回当前my-dir路径下所有子目录的Android.mk文件列表
this-makefile:返回当前makefile(构建系统从中调用的函数)的路径
parent-makefile:返回包含树父makefile的路径
import-module:按照模块名称查找包含Android.mk的文件路径<br>例如:$(call import-module,<name>)
Application.mk
概览:描述应用需要的原生模块.模块可以是静态库,共享库,可执行文件.定义要编译的多个GNU Makefile片段.位于$PROJECT/jni/<br>变量如下:
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 <br><ul><li>GNUMAKE -f <ndk>/build/core/build-local.mk <parameters><br></li><li>GNUMAKE 指向GNU Make 3.81或者更新版本<br></li><li><ndk>执行安装目录<br></li></ul>
从命令行调用<br>ndk-build文件位于NDK安装目录的顶层.请在应用的目录中或者子目录调用<br>例如: cd <project> <ndk>/ndk-build<br><project>指向项目的根目录<br><ndk>指向您安装的NDK的目录<br><br>
64位工具链和32位工具链<br>ndk脚本会自动选择工具链的版本<br>通过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选择.<br><br>
ABI Management
NEON
x86
x86-64
The cpufeatures Library
Libraries
使用自己的以及NDK提供的现有库
Prebuild Libraries
C++ Support
Native APIs
High-Performance Audio
Vulkan
Machine Learing
收藏
0 条评论
下一页