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;
}
- 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 3180518198@qq.com
*/
public class JNIKeyTools {
static {
System.loadLibrary("ywsdktools");
}
public static native String getKey();
}
详细见github