美文网首页
JNI动态加载方法

JNI动态加载方法

作者: T_Carbon | 来源:发表于2020-05-14 16:34 被阅读0次
    #include <jni.h>
    #include <string>
    #include <android/log.h>
    
    #define TAG "myDemo-jni" // 这个是自定义的LOG的标识
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
    #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
    #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型
    
    using namespace std;
    
    static JavaVM *g_currentJVM = nullptr;
    static jclass g_cls = nullptr;
    
    static const char *classPathName = "android/app/mmkv/MMKV";
    
    static int registerNativeMethods(JNIEnv *, jclass);
    
    jstring stringJni(JNIEnv *env, jobject) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    
    extern "C" JNIEXPORT JNICALL jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    
        g_currentJVM = vm;
        JNIEnv *env;
    
        if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
            return -1;
        }
    
        if (g_cls) {
            env->DeleteGlobalRef(g_cls);
        }
    
        jclass instance = env->FindClass(classPathName);
        if (!instance) {
            LOGE("fail to locate class: %s", classPathName);
            return -2;
        }
        g_cls = reinterpret_cast<jclass>(env->NewGlobalRef(instance));
    
        if (!g_cls) {
            LOGE("fail to create global reference for %s", classPathName);
            return -3;
        }
    
        int ret = registerNativeMethods(env, instance);
        if (ret != 0) {
            LOGE("fail to register native methods for class %s, ret = %d", classPathName, ret);
            return -4;
        }
    
        return JNI_VERSION_1_6;
    }
    
    
    static JNINativeMethod g_method[] = {
    
            {"stringJni", "()Ljava/lang/String;", (void *) stringJni}
    };
    
    static int registerNativeMethods(JNIEnv *env, jclass cls) {
    
        return env->RegisterNatives(cls, g_method, sizeof(g_method) / sizeof(g_method[0]));
    }
    

    相关文章

      网友评论

          本文标题:JNI动态加载方法

          本文链接:https://www.haomeiwen.com/subject/reztohtx.html