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

你可能感兴趣的:(JNI)