NDK
Android NDK 是一套允许您使用 C 和 C++ 等语言,以原生代码实现部分应用的工具集。在开发某些类型的应用时,这有助于您重复使用以这些语言编写的代码库。
参考:
Android NDK
NDK (Native Develop Kit),从含义很容易理解就是本地开发工具箱。大家都知道,Android 开发语言是Java,不过我们也知道,Android是基于Linux的,其核心库很多都是C/C++的,比如Webkit等。
使用
实际上我们开发Android应用使用平台提供的API就足够满足大部分需求,但是为什么Google仍旧提供NDK呢?
- 在平台之间移植应用
- 重复使用您自己或其他开发者的 C 或 C++ 库。
- 进一步提升设备性能,以降低延迟,或运行计算密集型应用,如游戏或物理模拟。
- 不依赖于Dalvik Java虚拟机的设计
- 代码的保护。
NDK到so
JNI
Java调用C/C++在Java语言里面本来就有的,并非Android自创的,即JNI。JNI就是Java调用C++的规范。当然,一般的Java程序使用的JNI标准可能和android不一样,Android的JNI更简单。
JNI (Java Native Interface),翻译过来就是Java本地接口。JNI是Java调用Native语言的一种特性。由于JNI是JVM规范的一部分,因此可以将我们写的JNI的程序在任何实现了JNI规范的Java虚拟机中运行。
使用
因为在实际需求中,需要Java代码与C/C++代码进行交互,通过JNI可以实现Java代码与C/C++代码的交互。
三个角色
如图所示:
实现一个简单的JNI调用
首先先加载本地动态库
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
编写一个JNI方法
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
编写的c++方法
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring
JNICALL
Java_com_example_remer_jnidemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
其中的规则:
Java_com_example_remer_jnidemo:包名
MainActivity:类名
stringFromJNI:方法名
jstring:返回值类型
其中JNIExport和JNICALL是不固定保留的关键字不要修改
规则如下图:
引用
Android NDK
cmake
Java Native Interface
Android JNI(一)——NDK与JNI基础