JNI學習筆記之AS+ndk+gradle自動編譯出so並整合流程

newtrek發表於2017-11-11

上一篇的方法完全是我們手動編譯並拷來拷去整合so庫的,這樣會很麻煩,但對初學者來說就應該這樣一步一步前進,混合程式設計本來就是個很複雜的流程,我覺得這樣把每個流程分開來學習是最好的。接下來,將介紹強大的AndroidStudio如何在上一個篇的基礎上利用gradle實現自動編譯。其實就是加幾個gradle指令碼。

1.建立工程

2.編寫java程式碼

主要是宣告native方法
比如:

public class JNIUtils {
    public static native String getStringFromNative();
}

3.新增配置

在src/main目錄下建立一個存放C/C++程式碼的資料夾,比如jni
然後再app的gradle檔案裡的android塊加個指令碼

    sourceSets {
        main{
            jni.srcDirs=["src/main/jni"]
        }
    }

這個想gradle構建系統表明我的工程的c/c++原始碼在該資料夾裡

在src/main/jni建立Android.mk檔案
然後配置對應的指令碼

 externalNativeBuild{
        ndkBuild{
            path "src/main/jni/Android.mk"
        }
    }

在android塊的defaultConfig塊新增

 ndk{
            abiFilters `armeabi-v7a`
        }

這個是設定只生成armeabi-v7a 平臺的so庫

4.gradle同步一下,完善C和Android.mk程式碼

在jni資料夾新增一個hello.c

#include <jni.h>

JNIEXPORT jstring JNICALL
Java_com_newtrekwang_ndkpractice_JNIUtils_getStringFromNative(JNIEnv *env, jclass type) {
    char* st="hello From C";
    return (*env)->NewStringUTF(env, st);
}

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)

5.編譯工程,執行

image.png
image.png


相關文章