Andorid Studio NDK開發:使用庫

姜家志發表於2016-06-19

C語言是一個巨大的寶庫,系統底層的很多的實現都是基於C語言實現的,比如影象處理,加密等。C語言的執行效率也是很高的,因此為了效率有時候也會引入第三方的C語言庫。

總而言之,會在NDK開發的過程中會使用大量的庫,系統自帶的庫,第三方庫等。在gradle-experimental中使用C語言的庫是非常便利的。

呼叫系統庫

Log是在Android開發過程用來除錯程式必備的工具之一,如何在NDK中使用android.util.Log方便在Logcat中檢視JNI程式的執行情況呢?這就需要在NDK中匯入Android系統的Log庫。

首先需要在在gradle中引入Log庫:

直接在ldLIbs中加入log就可以,如果需要引入其他的系統庫,只要在陣列中直接增加即可。
再定義一個native的方法:

public static native void callLogFromJni();

在Jni中呼叫Log庫的方法:

第一個引數,ANDROID_LOG_INFO是log的級別他包含:

一般我們常用的是 ADNROID_LOG_VERBOSE,ANDROID_LOG_DEBUG,ANDROID_LOG_INFO,ANDROID_LOG_WARN,ANDROID_LOG_ERROR 分別對應java中的Log.v,Log.d,Log.i,Log.w,Log.e

第二個引數是tag,用來方便的對log分類。第三個引數是message,對應log的具體資訊。

一般還會採用巨集定義的方式,定義Log的輸出的方法,方便呼叫:

這裡定義了一個warning log的巨集,在程式碼裡面可以直接呼叫:

使用第三方類庫

OpenSSL是最常用的加密庫之一,下面以OpenSSL為例,介紹下在gradle-experimental中如何引入第三方類庫。關於如何編譯Android下的OpenSSL詳見:編譯Android的OpenSSL類庫

首先定義對於庫的repositories:

c語言的類庫分為靜態連結庫(.a)和動態連結庫(.so),靜態類庫和動態類庫的引入方式是不一樣的,分為對應:StaticLibraryBinarySharedLibraryBinary。這裡引入的庫為靜態連結庫,名稱為:openssl.

指定庫依賴:

這裡在model.android.sources.main中指定庫的依賴為上面定義的openssl,linkage型別為static,如果是動態連結庫linkage就是shared。

因為編譯的OpenSSL只支援arm結構的cpu,因此需要指定abi為對應的cpu,在model.android新增配置:

使用OpenSSL

首先定義一個native方法,需要從OpenSSL中讀取隨機數:

生成對應的JNI方法:

RAND_seed是OpenSSL的方法,讀取隨機數。這段程式碼就是讀取一個128的隨機數,然後轉換為java的byte[]。

在介面上面使用讀取隨機數的方法:

執行之後可以在介面看到一段隨機的字串顯示:

Andorid Studio NDK開發:使用庫

從openssl中讀取隨機數

原始碼地址:https://github.com/jjz/android/tree/master/experimental

相關文章