從零開始完成一個Android JNI開發

安卓開發高階技術分享發表於2019-01-16

背景

最近的一個專案需要用到Android JNI開發,在這裡記錄了一下如何從零開始完成一個JNI開發。

我們知道,Android系統本身是包括Java層和C層兩部分的,相應的Android開發也分SDK開發和NDK開發兩種,SDK開發是Java程式碼,NDK開發則是C/C++程式碼,他們之間通過JNI介面來互動,Java程式碼可以呼叫外部的原生程式碼, 外部的C/C++ 程式碼可以呼叫Java程式碼。

 

環境配置

首先在Android Studio中安裝相關開發包,從settings中開啟Android SDK,然後安裝三個包:

 

接下來可參考超級簡單的Android Studio jni實現進行配置,並編寫hello world

需要注意的是,通過java程式碼生成c程式碼時(在新建的類上右鍵執行javah),有可能會遇到找不到類的錯誤,這時需要跑一遍App,讓它生成這個類檔案

 

相關檔案及其功能

主要涉及的檔案如下

 

在java中定義呼叫jni的java類,用來從java中呼叫,並生產jni中的h標頭檔案;

 

在app工程中的build.gradle,用來配置生成和使用jni;

 

jni資料夾中的Android.mk,用來配置引用、lib包名、待編譯的c檔案等;

 

jni資料夾中的Application.mk,用來配置生成的lib包名;

 

jni資料夾中的h標頭檔案,根據java類生成的;

 

jni資料夾中的c/cpp/h程式碼檔案,是c層程式碼;

 

需要注意的是,如果Android.mk中配置的待編譯c檔案改名了,在編譯so庫時會遇到報錯,提示改名前的檔案找不到,這是因為以前生成的so庫在干擾編譯,把原so庫目錄(MyTestApplication\app\src\main\obj)清除即可。

Java層呼叫C層

一般來說,JNI的業務模式大部分是從Java層呼叫C層的so庫

C層呼叫Java層

開發中有時會遇到從C層呼叫Java層的需求,也就是Java層—>C層so庫—>Java層的呼叫鏈,其中Java層呼叫C層so庫的方式同上,基本原理是,C層的JNIEnv型別代表Java環境。通過這個JNIEnv*指標,就可以對Java端的程式碼進行操作。

一段C層呼叫Java層的方法如下:

 

附錄

Android高階技術大綱,以及系統進階視訊;

 

附錄一;Android高階技術大綱

附錄二;Android進階系統資料視訊

獲取方式;

加Android進階群;701740775。即可前往免費領取。免費備註一下csdn

 

相關文章