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 [email protected]
*/
public class JNIKeyTools {
static {
System.loadLibrary("ywsdktools");
}
public static native String getKey();
}
詳細見github