1. 程式人生 > >最新androidStudio上jni開發全覆蓋

最新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
的支援,你可以這麼認為,在 Android Studio 2.2 之後你有2種選擇來編譯你寫的 c/c++ 程式碼。一個是 ndk-build + Android.mk + Application.mk 組合,另一個是 CMake + CMakeLists.txt 組合。這2個組合與Android程式碼和c/c++程式碼無關,只是不同的構建指令碼和構建命令。

ABI(Application binary interface)應用程式二進位制介面。不同的CPU 與指令集的每種組合都有定義的 ABI (應用程式二進位制介面),一段程式只有遵循這個介面規範才能在該 CPU 上執行,所以同樣的程式程式碼為了相容多個不同的CPU,需要為不同的 ABI

構建不同的庫檔案。當然對於CPU來說,不同的架構並不意味著一定互不相容。

  • 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++ 程式碼中有重要作用)

開始正題

  1. 首先你需要下載 NDK 和構建工具
       在開啟的專案中,從選單欄選擇 Tools > Android > SDK Manager。         點選 SDK Tools 標籤。         選中 LLDBCMakeNDK 旁的複選框,        三個部分都必須下載下來,LLBD是一種一種除錯程式,Android Studio 使用它來除錯原生程式碼

接下來

    如果你是要建立支援 C/C++ 的新專案,那就soeasy了     建立支援原生程式碼的專案與建立任何其他 Android Studio專案類似,不過前者還需要額外幾個步驟:
  1. 在嚮導的 Configure your new project 部分,選中 Include C++ Support 複選框。
  2. 點選 Next
  3. 正常填寫所有其他欄位並完成嚮導接下來的幾個部分。
  4. 在嚮導的 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。
  5. 點選 Finish
    現有工程中新增JNI     這個說實話,有點難度,給你個官網給你使用者指南  https://developer.android.google.cn/studio/projects/add-native-code.html#new-project大哭,但是我沒大看明白    好吧那就自己來。。。

開啟工程

在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);
}
自動生成了原生程式碼裡的函式。接下來的是工作就是呼叫了,沒啥難度。。。