Android | 第一個SO庫

一、Android NDK開發

參考之前的博文:

項目記錄 | Android NDK開發相關

二、Android SO庫

參考之前的博文:

關於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這個頭文件也行。
在這裏插入圖片描述

3.7 Demo

【GitHub-TestJNI-Demo】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章