so文件是C、C++的函數庫,在Android中 調用這些庫,使用的是JNI( Java Native interface)
JNI 可以使Java程序調用本地程序或者庫(一般是使用C、C++ 或者匯編語言編寫)。
這篇文章 會介紹 使用Android Studio 如何生成so文件,及如何使用so
一.NDK環境安裝
首先需要配置NDK 的環境,沒有環境的同學,自行google或者百度,網上有很多資料。
二.JNI 開發
1.創建JniUtil類
該類的作用是定義native 接口,如下圖,我們定義了一個getKey的native方法
2.生成class文件
執行gradle clean build 命令,生成class文件
查看?build\intermediates\classes\debug\包名 ? 路徑下是否存在JniUtil.class, 如果沒有重新build
3.使用javah生成.h頭文件
使用Tirminal或者 終端 切換目錄到build\intermediates\classes\debug\ ?下執行
javah -jni com.jni.demo.JniUtil ?(JniUtil類的路徑)?
會生成com_jni_demo_JniUtil.h 文件,內容如下
這個方法就對應我們在JniUtil類中定義native方法,
4.創建 jni目錄
在app/main/ 路徑下創建jni目錄(與java目錄同級),并將上面生成的com_jni_demo_JniUtil.h 文件復制到該目錄下
5.創建.c文件
在jni文件中創建?JniUtil.c 文件,編輯內容如下:
6.創建Android.mk和Application.mk文件?
在jni目錄中創建Android.mk文件,并編輯內容如下:
LOCAL_PATH := $(call my-dir) ? // 不需要調整(代碼所在的目錄,jni目錄)
include $(CLEAR_VARS) ? ?//不需要調整
LOCAL_MODULE := jniutil ?// 庫的名稱
LOCAL_SRC_FILES := JniUtil.c ?// 需要編譯的C、C++文件
include $(BUILD_SHARED_LIBRARY)
在jni了目錄下創建Application.mk 文件,編輯內容如下:
APP_ABI := armeabi armeabi-v7a x86 // 生成so文件的平臺 ,設置為all, 代表所有平臺
7.生成so文件
切換到main目錄下 執行ndk-build 生成so文件,
這里會生成了一個libs文件夾和obj文件及,都有 so文件,我做了測試,obj 文件下的是正確的,這里還沒有確定libs文件夾的作用。
三、加載so文件
1.將我們生成的so文件復制到 app下的libs文件夾下,并配置build.gradle 文件
2.使用System.loadLibrary("jniutil"); 加載so文件,可以將其寫在JniUtil類中
當我們調用getKey方法的時候,實際就是調用了so庫中的Java_com_jni_demo_JniUtil_getKey 方法