介绍:
NDK是一个允许你在Android上使用C或者C++的一个工具,提供库去让你可以控制native
的activity
。
- 使用
Android 2.2
以上 - NDK Android Native Developer Kit
- 使用cmake或者使用ndk-build
- LLDB 在As上
debug
Native
代码的库
对于编译NDK需要熟悉以下几点
- Native shared libraries:
C
或者C++
编译的.so
库 - Native static libraries:也可以编译静态库
.a
让其他库使用 - JNI:连接
java
和c++
之前的桥梁 - Application Binary Interface(ABI):ABI明确表明了机器码在系统运行时编译之间的交互,不同的
ABI
对应不同的架构,NDK支持的32-bit
,ARM
,AArch64
,x86
,x86-64
- Manifest:如果你写了一个没有java组件的app,必须在
manifest
中去声明manifest,
NDK的开发流程
设计架构,想想哪些是用
java
写,哪些用native
写创建一个
Android
- 如果要写一个纯
native
的app,在manifest
中声明NativeActivity
- 创建
Android.md
文件,用来描述Native Library
包括名字,flags,关联的库,在JNI
中包含的资源文件 - (可选)可以在
Android.md
中声明目标的ABIs,工具链toolchain
,release/debug mode
,STL
如果你没有指定的话,将会用默认值- ABI: all non-deprecated ABIs
- Toolchain: Clang
- Mode: Release
- STL: system
- 将你的native 资源文件放入
jni
目录中 - 用
ndk-build
命令编译native文件(.so .a)
- 编译java组件,生成
.dex
文件 - 打包
APK
关于NativeActivity和 Application
Android SDK提供了一个帮助类 NativeActivity ,是其处理Android Framework和native code之间的通讯,不用继承子类或者调用其中的方法,你所需要做的就是在
manifest
中去声明他,然后开始创建你的nativeapplication
其也是运行在虚拟机中,与其他的applicaiton隔离,可以通过JNI与java代码交互,也可以访问Android自己提供的其他Android Native方法
NDK提供了两种方案去实现你的native activity
native_activity.h
定义了NativeActivity的版本,包含了回调和数据结构,因为你app中的主线程处理回调,并且你的回调不能为空,如果是空的会ANR,因为主线程在收到回调的时候无响应android_native_app_glue.h
文件定义了一个静态的帮助库去构建native_activity.h
头文件,它生成另一个线程来结束事件,防止阻塞主线程
怎么使用这个类在
<ndk_root>/sources/android/native_app_glue/android_native_app_glue.h
中有文档
使用 native_activity.h 接口
- 创建一个
jni
目录, - 在
manifest
中声明你的activity
1 | <application android:label="@string/app_name" android:hasCode="false"> |
因为你的application没有java代码所以
hascode
设为false
1 | <activity android:name="android.app.NativeActivity" |
增加
name
属性
mata-data的
value声明入口,并且
name`声明包名
1 | <meta-data android:name="android.app.lib_name" |
- 创建native activity,并且实现接口
[
ANativeActivity_onCreate](https://developer.android.google.cn/ndk/reference/group___native_activity.html#ga02791d0d490839055169f39fdc905c5e)
native activity启动的时候会调用这个接口,这个函数类似于C/ c++中的main,它接收一个指向ANativeActivity结构的指针,该结构包含指向需要编写的各种回调实现的函数指针 - 将ANativeActivity->instance 字段设置为要使用的特定数据的实例的地址。
- 实现其他在你想要启动时的活动
- 实现在ANativeActivity->callbacks中的其他回调
- 开发application的剩余部分
- 在
jni
目录中增加Android.mk
文件 - 有了
mk
文件就可以编译啦
1 | cd <path>/<to>/<project> |