天天看點

android使用jni技術調用native層代碼android使用jni技術調用native層代碼前提設計到的知識點

android使用jni技術調用native層代碼

标簽(空格分隔): jni

前提

重要的業務使用c代碼實作,并向第三方提供sdk。解決方案:通過jni技術實作,并打包aar提供給第三方。

設計到的知識點

1.JNI的靜态和動态注冊

動态注冊:

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){

    //列印日志,說明已經進來了
    __android_log_print(ANDROID_LOG_DEBUG,"JNITag","enter jni_onload");

    JNIEnv* env = NULL;
    jint result = -1;

    // 判斷是否正确
    if((*vm)->GetEnv(vm,(void**)&env,JNI_VERSION_1_6)!= JNI_OK){
        return result;
    }

    //注冊四個方法,注意簽名
    const JNINativeMethod method[]={
            {"getKey","()Ljava/lang/String;",(void*)getKey}
    };

    //找到對應的JNITools類
    jclass jClassName=(*env)->FindClass(env,"kotlin/yw/ywsdk/jni/JNIKeyTools");

    //開始注冊
    jint ret = (*env)->RegisterNatives(env,jClassName,method, 1);

     //如果注冊失敗,列印日志
    if (ret != JNI_OK) {
        __android_log_print(ANDROID_LOG_DEBUG, "JNITag", "jni_register Error");
        return -1;
    }

    return JNI_VERSION_1_6;
}
           
  1. Android.mk檔案
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := ywsdktools

LOCAL_SRC_FILES := jnitools.c

LOCAL_LDLIBS :=  -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)

           

3.對應子產品的gradle.build(我隻展示了android{})

android {
    compileSdkVersion 27


    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        ndk{
            moduleName "ywsdktools"
            abiFilters 'x86','armeabi-v7a','arm64-v8a'
            ldLibs "log"
        }

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

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

}
           

4.android端Native代碼

package kotlin.yw.ywsdk.jni;

/**
 * Created on 2019/9/1515:49.
 * Author jackyang
 * -------------------------------
 *
 * @description
 * @email [email protected]
 */
public class JNIKeyTools {
    static {
        System.loadLibrary("ywsdktools");
    }
    public static native String getKey();
}

           

詳細見github