Android之NDK(一)介绍

介绍:

NDK是一个允许你在Android上使用C或者C++的一个工具,提供库去让你可以控制nativeactivity

  • 使用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:连接javac++之前的桥梁
  • Application Binary Interface(ABI):ABI明确表明了机器码在系统运行时编译之间的交互,不同的ABI对应不同的架构,NDK支持的32-bit ,ARM, AArch64, x86, x86-64
  • Manifest:如果你写了一个没有java组件的app,必须在manifest中去声明manifest,

NDK的开发流程

  1. 设计架构,想想哪些是用java写,哪些用native

  2. 创建一个Android

  3. 如果要写一个纯native的app,在manifest中声明NativeActivity
  4. 创建Android.md文件,用来描述Native Library包括名字,flags,关联的库,在JNI中包含的资源文件
  5. (可选)可以在Android.md中声明目标的ABIs,工具链toolchain,release/debug mode,STL如果你没有指定的话,将会用默认值
    • ABI: all non-deprecated ABIs
    • Toolchain: Clang
    • Mode: Release
    • STL: system
  6. 将你的native 资源文件放入jni目录中
  7. ndk-build命令编译native文件(.so .a)
  8. 编译java组件,生成.dex文件
  9. 打包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 接口

  1. 创建一个jni目录,
  2. manifest中声明你的activity
1
<application android:label="@string/app_name" android:hasCode="false">

因为你的application没有java代码所以hascode 设为false

1
2
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name">

增加name属性

mata-datavalue声明入口,并且name`声明包名

1
2
3
4
5
6
<meta-data android:name="android.app.lib_name"
android:value="native-activity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
  1. 创建native activity,并且实现接口[ANativeActivity_onCreate](https://developer.android.google.cn/ndk/reference/group___native_activity.html#ga02791d0d490839055169f39fdc905c5e)native activity启动的时候会调用这个接口,这个函数类似于C/ c++中的main,它接收一个指向ANativeActivity结构的指针,该结构包含指向需要编写的各种回调实现的函数指针
  2. 将ANativeActivity->instance 字段设置为要使用的特定数据的实例的地址。
  3. 实现其他在你想要启动时的活动
  4. 实现在ANativeActivity->callbacks中的其他回调
  5. 开发application的剩余部分
  6. jni目录中增加Android.mk文件
  7. 有了mk文件就可以编译啦
1
2
cd <path>/<to>/<project>
<ndk>/ndk-build

NDK Samples

参考

android官方文档

NDK例子

谢谢您的鼓励~