Android studio 編譯NDK Android studio 生成.so并調用SO

<meta charset="utf-8">

直接上干貨吧
第1步:新建一個Android Studio 工程 TestJNI。新建一個JNITest.java文件,內容如下:
public class JNITest {
    static {
        System.loadLibrary("JNITest");
    }
    public static native String getJniTestString();
}

解釋一下,先創建一個native的方法,JNITest名字可以隨便寫,但是最后要和so文件的名字一樣。

第2步:生成jni頭文件,咱們這里可以配置一下宏命令,方便以后使用
  1. 配置宏命令 File-->Setting-->Tools-->External Tools
image

需要添加的我都放下面了,可以直接復制過去

Program: javah
Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $SourcepathEntry$

2.保存之后咱們看下怎么使用剛才配置的命令,在剛才咱們創建好的類上面右鍵 External Tools --> javah 這個也就是上面咱們配置的名字,如下圖:

image

完成之后看下有沒有生成成功,你會發現已經在main文件下面多了一個jni的文件夾,里面有一個com_umfintech_testjni_JNITest.h 這個名字是通過咱們報名和類名生成的,如下圖:

image
第3步:在jni目錄創建.c、.cpp 、.mk文件

1.先創建JNITest.c文件,第一行固定寫法,第二行復制剛才生成的.h的文件名,方法還是繼續復制.h中的,如下:

#include "jni.h"
#include "com_umfintech_testjni_JNITest.h"
JNIEXPORT jstring JNICALL Java_com_umfintech_testjni_JNITest_getJniTestString
  (JNIEnv * env, jclass object){
    return (*env)->NewStringUTF(env,"測試 jni");
  }

2.創建Android.mk文件,如下圖

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#編譯生成的文件的類庫叫什么名字,就是剛才我前面提到的名字
LOCAL_MODULE    := JNITest
#要編譯的c文件,上面咱們剛創建的
LOCAL_SRC_FILES := JNITest.c
include $(BUILD_SHARED_LIBRARY)

3.創建Application.mk文件,如下圖

APP_ABI := all

第4步:配置NDK

1.在項目的根目錄的gradle.properties文件中加上以下代碼,表示我們要使用NDK進行開發:

android.useDeprecatedNdk=true

2.在項目local.properties中加入ndk的路徑:

ndk.dir=D\:\\android-ndk-r16b   // NDK路徑

3.在appbuild.gradledefaultConfig中添加如下配置:

ndk {
    moduleName "MyJni"
    abiFilters "armeabi", "armeabi-v7a", "x86"http://cpu的類型
}
sourceSets.main {
    jni.srcDirs = ['libs']
}

注意:moudleName這是我們在gradle文件中一樣的,必須保持一致才能找到。

第5步:配置ndk-build,生成.so文件

1.配置ndk-build命令

image
Program:D:\android-ndk-r16b\ndk-build.cmd
Working directory: $ModuleFileDir$\src\main\

注意:Program設置自己ndk的路徑

2.通過ndk-build命令生成.so文件

在jni目錄右鍵 External Tools --> ndk-build,會在main下面生成相應的.so文件,如下圖:

image
第6步:java調用.so文件

main下面創建jniLibsarmeabi文件復制進去,如下圖:

image

看下activity中怎么調用

public class MainActivity extends AppCompatActivity {
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.text);
        text.setText(JNITest.getJniTestString());
    }
}

作者:越努力越幸運陽
鏈接:http://www.lxweimin.com/p/4c7d9a10933b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。