最新androidStudio上jni開發全覆蓋
JNI(Java Native Interface):Java本地介面。是為了方便Java呼叫c、c++等原生代碼所封裝的一層介面(也是一個標準)。大家都知道,Java的優點是跨平臺,但是作為優點的同時,其在本地互動的時候就程式設計了缺點。Java的跨平臺特性導致其本地互動的能力不夠強大,一些和作業系統相關的特性Java無法完成,於是Java提供了jni專門用於和原生代碼互動,這樣就增強了Java語言的本地互動能力。
NDK(Native Development Kit) : 原生開發工具包,即幫助開發原生程式碼的一系列工具,包括但不限於編譯工具、一些公共庫、開發IDE等在Android Studio 2.2 之後,工具中增加了
CMake
ndk-build
+ Android.mk
+ Application.mk
組合,另一個是 CMake
+ CMakeLists.txt
組合。這2個組合與Android程式碼和c/c++程式碼無關,只是不同的構建指令碼和構建命令。
ABI
(Application binary interface)應用程式二進位制介面。不同的CPU 與指令集的每種組合都有定義的 ABI
(應用程式二進位制介面),一段程式只有遵循這個介面規範才能在該 CPU 上執行,所以同樣的程式程式碼為了相容多個不同的CPU,需要為不同的 ABI
- armeabi裝置只相容armeabi;
- armeabi-v7a裝置相容armeabi-v7a、armeabi;
- arm64-v8a裝置相容arm64-v8a、armeabi-v7a、armeabi;
- X86裝置相容X86、armeabi;
- X86_64裝置相容X86_64、X86、armeabi;
- mips64裝置相容mips64、mips;
- mips只相容mips
以上內容都來自於百度百科和簡書。主要用於掃盲。
下面介紹這四個函式
第一個不說了,就是要求的最低版本
cmake_minimum_required(VERSION 3.4.1) # 編譯出一個動態庫 myjni,原始檔只有 src/main/jni/myjni.c add_library(myjni SHARED myjni.c) # 找到預編譯庫 log_lib 並link到我們的動態庫 myjni中,就是下面兩個函式的作用 find_library(log-lib log) target_link_libraries(myjni ${log-lib})
(以上四個函式在向現有專案新增 C/C++ 程式碼中有重要作用)
開始正題
- 首先你需要下載 NDK 和構建工具
接下來
如果你是要建立支援 C/C++ 的新專案,那就soeasy了 建立支援原生程式碼的專案與建立任何其他 Android Studio專案類似,不過前者還需要額外幾個步驟:- 在嚮導的 Configure your new project 部分,選中 Include C++ Support 複選框。
- 點選 Next。
- 正常填寫所有其他欄位並完成嚮導接下來的幾個部分。
- 在嚮導的 Customize C++ Support 部分,您可以使用下列選項自定義專案:
- C++ Standard:使用下拉列表選擇您希望使用哪種 C++ 標準。選擇 Toolchain Default 會使用預設的 CMake 設定。
- Exceptions Support:如果您希望啟用對 C++ 異常處理的支援,請選中此複選框。如果啟用此複選框,Android Studio 會將
-fexceptions
標誌新增到模組級build.gradle
檔案的cppFlags
中,Gradle 會將其傳遞到 CMake。 - Runtime Type Information Support:如果您希望支援 RTTI,請選中此複選框。如果啟用此複選框,Android Studio 會將
-frtti
標誌新增到模組級build.gradle
檔案的cppFlags
中,Gradle 會將其傳遞到 CMake。
- 點選 Finish
開啟工程
在src\main\目錄下新建一個名為jni的目錄(名稱和父目錄可以隨意)
在src\main\jni\目錄內新建一個名稱為CMakeLists.txt的檔案(該檔名稱固定為CMakeLists.txt)CMakeLists.txt檔案也可在專案根目錄下新建
CMakeLists.txt的內容就是上面的那四個函式
cmake_minimum_required(VERSION 3.4.1)
add_library(myjni SHARED myjni.c)
find_library(log-lib log)
target_link_libraries(myjni ${log-lib})
接下來
在src\main\jni\目錄內新建一個c檔案myjni.c,在檔案中新增 #include <jni.h>
點選IDE選單的android目錄下,選中專案app右擊---》Link C++ Project with Gradle
Build System選擇CMake
Project Path選擇上面建立的CMakeLists.txt
點選確定
再接下來
在java檔案中新增native程式碼
static { System.loadLibrary("myjni"); } public native String helloJni();
還有一個牛逼的操作是這個不用生成標頭檔案。。。
滑鼠點選放到native函式上(後面那個函式名helloJni)
會提示Cannot resolve corresponding JNI function Java_com_example_jiang_hellojnitest_MainActivity_helloJni
按Alt + Enter點選Create---
神奇的一幕發生了。。。。
JNIEXPORT jstring JNICALL Java_com_example_yaphet_javausec_JNII_helloJni(JNIEnv *env, jobject instance) { // TODO char * returnValue=" I am from C"; return (*env)->NewStringUTF(env, returnValue); }自動生成了原生程式碼裡的函式。接下來的是工作就是呼叫了,沒啥難度。。。