NDK
Android NDK 是一套允許您使用 C 和 C++ 等語言,以原生代碼實(shí)現(xiàn)部分應(yīng)用的工具集芹橡。在開發(fā)某些類型的應(yīng)用時(shí)毒坛,這有助于您重復(fù)使用以這些語言編寫的代碼庫。
參考:
Android NDK
NDK (Native Develop Kit)林说,從含義很容易理解就是本地開發(fā)工具箱煎殷。大家都知道,Android 開發(fā)語言是Java腿箩,不過我們也知道豪直,Android是基于Linux的,其核心庫很多都是C/C++的珠移,比如Webkit等弓乙。
使用
實(shí)際上我們開發(fā)Android應(yīng)用使用平臺(tái)提供的API就足夠滿足大部分需求,但是為什么Google仍舊提供NDK呢钧惧?
- 在平臺(tái)之間移植應(yīng)用
- 重復(fù)使用您自己或其他開發(fā)者的 C 或 C++ 庫暇韧。
- 進(jìn)一步提升設(shè)備性能,以降低延遲浓瞪,或運(yùn)行計(jì)算密集型應(yīng)用懈玻,如游戲或物理模擬。
- 不依賴于Dalvik Java虛擬機(jī)的設(shè)計(jì)
- 代碼的保護(hù)乾颁。
NDK到so
JNI
Java調(diào)用C/C++在Java語言里面本來就有的涂乌,并非Android自創(chuàng)的艺栈,即JNI。JNI就是Java調(diào)用C++的規(guī)范骂倘。當(dāng)然眼滤,一般的Java程序使用的JNI標(biāo)準(zhǔn)可能和android不一樣,Android的JNI更簡單历涝。
JNI (Java Native Interface)诅需,翻譯過來就是Java本地接口。JNI是Java調(diào)用Native語言的一種特性荧库。由于JNI是JVM規(guī)范的一部分堰塌,因此可以將我們寫的JNI的程序在任何實(shí)現(xiàn)了JNI規(guī)范的Java虛擬機(jī)中運(yùn)行。
使用
因?yàn)樵趯?shí)際需求中分衫,需要Java代碼與C/C++代碼進(jìn)行交互场刑,通過JNI可以實(shí)現(xiàn)Java代碼與C/C++代碼的交互。
三個(gè)角色
如圖所示:
實(shí)現(xiàn)一個(gè)簡單的JNI調(diào)用
首先先加載本地動(dòng)態(tài)庫
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
編寫一個(gè)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());
}
其中的規(guī)則:
Java_com_example_remer_jnidemo:包名
MainActivity:類名
stringFromJNI:方法名
jstring:返回值類型
其中JNIExport和JNICALL是不固定保留的關(guān)鍵字不要修改
規(guī)則如下圖:
引用
Android NDK
cmake
Java Native Interface
Android JNI(一)——NDK與JNI基礎(chǔ)