一、Android NDK開發
參考之前的博文:
二、Android SO庫
參考之前的博文:
三、第一個SO庫製作
介紹一下如何往已有工程添加SO庫。一起動手實踐第一個SO庫。主要的步驟如下:
3.1 在main目錄下新建jni目錄
3.2 找到項目的gradle.properties,添加一行 android.useDeprecatedNdk=true
3.3 在jni目錄下添加一個空的C/CPP源文件
在這裏,我創建了一個空的hello.cpp
3.4 在jni目錄下添加Android.mk和Application.mk 並在build.gradle添加配置
Android.mk的作用:指定源碼編譯的配置信息,如如工作目錄,編譯模塊的名稱,參與編譯的文件等。
LOCAL_PATH := $(call my-dir)
// 設置工作目錄,而my-dir則會返回Android.mk文件所在的目錄
include $(CLEAR_VARS)
// 清除幾乎所有以LOCAL——PATH開頭的變量(不包括LOCAL_PATH)
LOCAL_MODULE := helloJni
// 設置模塊的名稱,即編譯出來libhelloJni.so文件名
// 注,要和上述步驟中build.gradle中NDK節點設置的名字相同
LOCAL_SRC_FILES := hello.cpp
// 指定參與模塊編譯的C/C++源文件名
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY)
// 指定生成的靜態庫或者共享庫在運行時依賴的共享庫模塊列表
- 注意,一定不要有空格。
Application.mk的作用:配置編譯平臺相關內容。
APP_PLATFORM := android-16
// APP_PLATFORM最低支持的AndroidAPI版本
APP_ABI := armeabi-v7a
// 最常用的APP_ABI字段:指定需要基於哪些CPU平臺的.so文件
build.gradle主要是指定上述二個文件的路徑,寫法如下:
3.5 定義java層的native方法,並通過javah生成C++層的函數聲明
在java層引用so庫,聲明native方法,如下所示:
那麼接下來,我們要生成這個native方法在C/CPP層的聲明,詳見【Android Studio 快速生成jni頭文件】。
3.5.1 配置External Tools。點擊File->settings->ExternalTools->點擊綠色加號
配置javah工具
Name: javah
Description: javah
Group: NDK
Program: javah.exe 注意:這裏選擇javah.exe所在的路徑(在jdk安裝路徑裏)
Parameters: -classpath . -jni -encoding $FileEncoding$ -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $ModuleFileDir$/src/main/java
生成native方法的C/C++層函數定義。
一般的定義形式爲:
JNIEXPORT 返回類型 JNICALL Java_包名_類名_方法名(JNIEnv *env, 原有參數列表...);
方法是:通過對native函數所在的java文件右鍵NDK->javah,即可生成一個C/C++層函數定義。
如圖所示:
生成的結果:
3.6 將該聲明拷貝到hello.cpp,並刪除剛纔生成的那個文件,我們就可以實現內部的功能了。
或者不刪除,在CPP函數中include這個頭文件也行。