在平時的開發過程當中,大多數人可能沒有JNI方面的需求,所以JNI方面的工程配置、如何開始也都不太瞭解,而網上對此方面的介紹也比較少。所以,本系列文章將從一個新手的角度開始,介紹JNI編程。java
Android NDK
是一套容許您使用 C 和 C++ 等語言,以原生代碼實現部分應用的工具集。在開發某些類型的應用時,這有助於您重複使用以這些語言編寫的代碼庫。android
JNI
是Java Native Interface的縮寫,它提供了若干的API
實現了Java和其餘語言的通訊(主要是C
&C++
)。從Java1.1開始,JNI標準成爲Java平臺的一部分,它容許Java代碼和其餘語言寫的代碼進行交互。編程
在建立Android Project時,在建立的首頁中勾選Include C++ support
選項便可建立一個模板的hello world程序,可直接運行。相比於普通的Android工程,勾選該項後的工程有如下不一樣: bash
能夠看到,多出了一個native-lib.cpp(C++代碼)
文件和一個CMakeLists.txt(C++相關配置)
文件,app模塊下的build.gradle
文件也添加了相關配置。app
在該默認工程中,咱們能夠看到一些相關代碼:工具
CMakeLists內容:gradle
# 聲明最低的cmake版本
cmake_minimum_required(VERSION 3.4.1)
# 添加一個名稱叫native-lib的動態庫,該庫的源文件爲src/main/native-lib.cpp
add_library( native-lib # 庫的名稱
SHARED # SHARED:動態庫、STATIC:靜態庫
src/main/native-lib.cpp # 源文件,能夠是多個
)
# 尋找系統中的log庫,保存在log-lib變量中
find_library( log-lib
log )
# native-lib這個庫會去依賴log-lib這個庫
target_link_libraries( native-lib
${log-lib} )
複製代碼
Java中加載本地庫,而且定義native方法:ui
// 加載的library名稱,注意:不是C++文件的名稱
static {
System.loadLibrary("native-lib");
}
複製代碼
/**
* java中定義方法的名稱,會根據包名、類名、參數、返回值類型尋找對應的C++方法
*/
public native String stringFromJNI();
複製代碼
C++中定義好對應的方法:this
//對應於java中的stringFromJNI方法
extern "C" JNIEXPORT jstring JNICALL Java_com_wsy_jnitest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
複製代碼
這樣便可實現C++向Java傳遞一個String。其中的映射規則會在後面進行介紹。google
build.gradle
:總配置文件,在其中指定CMakeLists.txt的路徑;
CMakeLists.txt
:native代碼的配置,包括和其餘庫的依賴配置、工程庫編譯出的結果(靜態庫、動態庫、可執行文件)等;
主C++文件
:native代碼的實現;
以上就是一個簡單的JNI操做,實際的開發過程當中不可能僅僅只是這麼簡單的一個操做,後面會對一些具體操做進行介紹。包括CMakeLists、Java和C++的互相調用、異常處理等。