android JNI动态注册

android JNI动态注册的方式相较于静态注册在实际的开发应用中是相当快捷与方便滴
在java代码中只需将native函数声明,并将JNI函数库加载进去即可
在jni.cpp文件的代码中定义调用与被调用的函数即可。
然后就可以进行注册使用。下面使用代码举例:
#include <jni.h>
/**
 * JNINativeMethod由三部分组成,可添加多组对应:
 * (1)Java中的函数名;
 * (2)函数签名,格式为(输入参数类型)返回值类型;
 *  ()Ljava/lang/String; ()表示无参,Ljava/lang/String;表示返回String,在对象类名(包括包名,‘/’间隔)前面加L,分号结尾
 * (3)native函数名
 */

/*  括号{}内的引号内的函数一个是java中的函数(native_test_login)  
 (void*)function一个是cpp文件中的函数(native_test_login)
 中间的是返回值类型以及参数类型
*/
static JNINativeMethod gMethods[] = {
        {   "native_test_login", "()Ljava/lang/String;", (void *) native_test_login    },
        {   "native_test_call", "()Ljava/lang/String;", (void *) native_test_call    },
        {   "maintest", "()Ljava/lang/String;", (void *) maintest   }
};

//System.loadLibrary过程中会自动调用JNI_OnLoad,在此进行动态注册
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    JNIEnv *env = NULL;
    jint result = JNI_FALSE;
    //获取env指针
    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
        return result;
    }
    if (env == NULL) {
        return result;
    }
    //获取类引用,写类的全路径(包名+类名)。该类是加载JNI函数的类文件
    jclass clazz = env->FindClass("com/skylight/cttstreamingplayer/MainActivity");
    if (clazz == NULL) {
        return result;
    }
    //注册方法
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return result;
    }
    //成功
    result = JNI_VERSION_1_6;
    return result;
}

猜你喜欢

转载自blog.csdn.net/Stone_OverLooking/article/details/79346327