Get Started
安装:
- 下载NDK,解压(一般是解压到SDK里面,但也可以是其他位置)
- 配置环境变量:在系统PATH环境变量中添加NDK的根路径
Concepts
介绍
NDK就是能让你在安卓应用中运行C和C++代码(称为”native code”)的工具
主要组件
- ndk-build:NDK的核心工具,用来编译native代码,生成二进制文件(机器可直接运行的),并且自动将这些文件复制到你的app路径中(对于android studio 也就是app-src-main下面)
native方法的生命需要加一个native标识符:
public native int add(int x, int y);
表明这个方法在一个native库里面
Native共享库,也就是C或者C++代码编译后产生的 .so文件
注意:如果两个库的某个函数使用了同样的名字,在不构成C++的重载情况下,都被视为重复的,将会编译报错native静态库:.a结尾,可以连接其他库
JNI(java native interface): Java和C++的调用接口
ABI(Application Binary Interface): 因为运行环境的硬件实现不用,所以ABI是用来供在不用的硬件下运行调用的。也即是.so文件干的事
Manifest:如果你的应用 没用java组件,需要在manifest中声明NativeActivity
- 下面两个文件需要在ndk编译的时候用到:
- Android.mk:编译配置文件,ndk-build命令调用时会看这个文件,里面定义了module名字和native code的文件名字等其他信息
- Application.mk: 需要的组件的信息
使用流程
- 决定哪个用native code写
- 创建一个安卓项目
- 如果只用native 代码写应用,要在清单文件中配置
- 创建Android.mk文件
- 创建你的Application.mk,这里面如果有些配置你没说明,将使用下面默认的配置
ABI: armeabi
Toolchain: GCC 4.8
Mode: Release
STL: system - 将你的native代码放在jni目录下
- 使用ndk-build来编译代码(需要的在jni目录下执行)
- 应用打包
BUILD
Andorid.mk文件
开头语句:
LOCAL_PATH := $(call my-dir)
指示你源文件的位置,my-dir是个宏,它保存了你的Android.mk的路径位置
下一句:
include $(CLEAR_VARS)
作用是清除变量,像LOCAL_MODULE, LOCAL_SRC_FILES, 以及LOCAL_STATIC_LIBRARIES,但是注意它不清楚上面的PATH变量,为什么清除,因为GNU Makefile时,这些变量是全局共用的
接下来:
LOCAL_MODULE := hello-jni
相当于给你native code组件取个名字,.so文件的名字就是lib + 你的module名字合成的,不用module的名字必须独一无二,且没有空格
下一句:
LOCAL_SRC_FILES := hello-jni.c
指示你C或者C++文件的名字
最后一句:
include $(BUILD_SHARED_LIBRARY)
让GNU makefile收集相关的变量信息运行
Application.mk
常用的是平台变量: