NDK:一步步編譯Android so包

1.環境搭建

本教程基於AS3.4.2的,目前穩定版最新的。需要下載LLDB,NDK,CMake就行,下載完後as自動配置,所以比較簡單,只需要把上面幾個選線勾選上,單擊apply即可。
在這裏插入圖片描述

2 開始

2.1 創建項目工程

這個比較簡單,只需要創建一個空白的項目工程即可,要確保它是可以正常運行。

2.2 準備工作

  • 創建一個純java類,Test.java
public class Test {
    static {
        System.loadLibrary("MyJni");//加載so的名稱
    }
    public native static String get();//方法
}

static塊是加載so包的,不用加後綴名。

這個Java類中的方法和c語言的方法是一一對應的,切勿寫錯了。把這個文件用java命令javac編譯成 .class 文件,這就需要使用javac命令來實現。

  • 生成 .class 文件
javac java路徑
// 如:javac E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java

執行完後在同樣的目錄下出現一個.class 文件。(其實這一步也可以不單獨做,在獲取頭文件時,會自動編譯的)

  • 生產 .h 頭文件
    打開Android studio 下的terminal 控制檯,通過命令切換到main目錄下。
    然後執行生成頭文件命令:
    javac  -encoding  utf8  -h .\jni  path
//javac命令 編碼			  頭文件 保存路勁 編譯路勁
//如:javac -encoding utf8 -h .\jni E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java

執行成功後,在jni目錄下會看到 .h 文件(名字是自己命名好的)

2.3 編寫 .c 文件

  • 新建 .c 文件
    在Android studio 新建一個 .c 文件,如下圖,但是目錄一定要在jni目錄下,和 .h 放在一起。
    在這裏插入圖片描述
  • 碼程序
#include<jni.h>
#include<stdio.h>
#include "com_haochen_sopackagetest_Test.h"

JNIEXPORT jstring JNICALL Java_com_haochen_sopackagetest_Test_get
(JNIEnv *env, jclass jclass) {
    return (*env)->NewStringUTF(env, "This is my first NDK Application,my name is navy");
}

具體裏面爲什麼這麼寫,這就涉及到NDK語法了。

  • .mk 文件
    這個文件目的是配置編譯路勁。
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyJni //so的名稱,必須要和配置文件以及類中名稱要一致。
LOCAL_LDFLAGS := -Wl

LOCAL_SRC_FILES := E:\AndroidProjects\SoPackageTest\app\src\main\jni\My.c// c 文件路勁

LOCAL_C_INCLUDES += E:\AndroidProjects\SoPackageTest\app\src\main\jni //include 文件

include $(BUILD_SHARED_LIBRARY)

右擊Android.mk->Link C++ Project with Gradle ,彈出Link C++ Project with Gradle 對話框,選擇 ndk-build 以及 Android.mk 路徑,點擊OK

  • 配置build.gradle
    在Android defaultconfig設置如下
ndk {
            moduleName "MyJni"//so名稱
            abiFilters 'arm64-v8a'//支持的so包的格式
    }

在Android 下設置:

externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }

到此,配置算是完成,執行程序成功後,我們就能在下面目錄中找到so包。
在這裏插入圖片描述

值得注意的是:包名的要一致

編譯好的so可以拷到不同項目中用,若是需要不同平臺的so,只需要在build.gradle 中的ndk選項中設置不同平臺,編譯成功後,會有不同平臺的so包。

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