天天看點

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

一、概要

最近項目需要,要把代碼中加密的部分打包成so檔案,剛開始接觸的時候真是痛苦呀,網上好多資料,都不是很詳細,步驟也不清晰,是以我整理了一下,希望大家喜歡。

現在android studio打包so檔案有兩種方式,第一種是ndk-build編譯項目,還有一種用cmake腳本建構項目,今天主要介紹ndk-build的編譯過程

二、ndk-build 建構過程

1,下載下傳ndk和建構工具

正所謂:“工欲善其事必先利其器”,我們今天的主要工具是android studio2.3版本,至于 android studio環境搭建,sdk,jdk什麼的,你們自己去弄,這裡主要是講解ndk編譯c語言的配置。

為您的應用編譯和調試原生代碼,您需要以下元件:

android 原生開發工具包 (ndk):這套工具集允許您為 android 使用 c 和 c++ 代碼,并提供衆多平台庫,讓您可以管理原生 activity 和通路實體裝置元件,例如傳感器和觸摸輸入。

cmake:一款外部建構工具,可與 gradle 搭配使用來建構原生庫。如果您隻計劃使用 ndk-build,則不需要此元件。

lldb:一種調試程式,android studio 使用它來調試原生代碼。

您可以使用 sdk 管理器安裝這些元件:

在打開的項目中,從菜單欄選擇 tools > android > sdk manager(或者在頂部工具欄中直接點選sdk manager, 下圖的标記就是從這裡點選的)。

點選 sdk tools 标簽。

選中 lldb、cmake 和 ndk 旁的複選框,如圖 1 所

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

點選 apply,然後在彈出式對話框中點選 ok。

安裝完成後,點選 <b>finish</b>,然後點選 ok。

sdk環境配置:

提前建立一個測試用的項目 ndkdemo

切換到project工程目錄,打開project structure (方法一,直接在工具欄打開,如下圖所示,方法二, 右鍵工程目錄 -&gt; open module settings)

選擇左邊欄 sdk location

在android ndk location 位置,選擇 ndk安裝包的路徑,一般放在sdk目錄下(下圖是我mac系統放置ndk的路徑,windows系統也類似,大家自己選擇)

點選 ok

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

為最外層工程目錄下的gradle.properties的檔案末尾加上android.usedeprecatedndk=true這段代碼(如果沒有這個目錄,自己建立一個),如下圖所示:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

ok,上面我們把環境給配置好了,下面我們就可以寫java和c代碼了

2,java代碼和c代碼的編寫過程

1,首先建立一個java類jniutils.java,代碼如下

2,重新make project一下工程如下圖2-1,完成後會在工程目錄 ... /ndkdemo/app/build/intermediates/classes/debug/com/niwoxuexi/ndkdemo 看到自己編譯後的classes檔案jniutils.class如下圖2-2所示:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

圖:2-1

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

圖:2-2

3,用javah工具生成頭檔案

1) 首先建立一個java類jniutils.java,

2) 代碼在studio打開terminal指令行工具,打開步驟是view-&gt;tool windows-&gt;terminal (或者在下邊的工具欄中直接打開或直接按alt+f12)

在指令行中先進入到工程的main目錄下

3) 輸入指令:javah -d jni -classpath 自己編譯後的class檔案的絕對路徑

例如:

javah -d jni -classpath /users/zhuxiaocheng/android/workspace/ndkdemo/app/build/intermediates/classes/debug com.niwoxuexi.ndkkemo.jniutils

注意: 1, debug後的空格

2, windows 系統路徑中的檔案的分割線是 '\' 而不是mac系統的 '/' 

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

4)按回車之後就會在main目錄下生成jni檔案夾,同時生成.h檔案 如下圖所示

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

5) 現在我們在jni目錄下建立一個 native-lib.c 的 c 檔案,内容如下

6)會後在app的build.gradle配置檔案中添加如下代碼:

如圖所示:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

7) 最後在我們來測試一下,隻需要在mainactivity中調用一下c就可以了,代碼如下:

8) 直接運作項目,結果如下所示:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

ok,沒問題,可以調用,其實也沒有想象中的那麼難。

三、調用編譯過的 .so 庫

上邊編譯完成了,有人會問:我要的是編譯後的.so庫,别人用的時候直接拿來用就可以了,那編譯後的.so庫在哪呢?不要着急,請看下圖:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

根據這個路徑就可以找到指定輸出的三種體系結構下的.so庫檔案,然後把.so檔案複制出來,如下圖所示的放到相應libs的檔案夾,

1, 把複制的so包,放到項目的libs目錄下

2, 在app module 下的buide.gradle 中添加下面代碼:

android studio ndk-build 編譯C生成.so檔案(ndk基礎篇

ok, 這樣就可以了

四、總結

<b>也沒什麼好總結的,直接按照上面步驟一步一步來,就可以了,jni調用過程有什麼問題,歡迎留言!</b>