zoukankan      html  css  js  c++  java
  • JNI-使用RegisterNatives注册本地方法

    转自: http://blog.chinaunix.net/uid-26009923-id-3410141.html

    1. 以前在jni中写本地方法时,都会写成 Java_com_example_hellojni_HelloJni_stringFromJNI的形式,函数名很长,而且当类名变了的时候,函数名必须一个一个的改,麻烦。
    现在好了有了RegisterNatives,现在一片顶过去五片,蓝瓶的好喝的!
    2. hello-jni.c中

    #include <string.h>
    #include <jni.h>
    #include <android/log.h>
    
    #define TAG "HELLO"
    #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)
    #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)
    
    # define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
    
    jstring native_stringFromJNI( JNIEnv* env, jobject thiz )
    {
        return (*env)->NewStringUTF(env, "Hello from JNI !");
    }
    static const char *classPathName = "com/example/hellojni/HelloJni";
    
    static JNINativeMethod methods[] = {
            {"stringFromJNI", "()Ljava/lang/String;", (void*)native_stringFromJNI},
    };
    
    jint JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;
        jclass clazz;
        //获取JNI环境对象
        if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
            LOGE("ERROR: GetEnv failed
    ");
            return JNI_ERR;
        }
        //注册本地方法.Load 目标类
        clazz = (*env)->FindClass(env,classPathName);
        if (clazz == NULL)
        {
            LOGE("Native registration unable to find class '%s'", classPathName);
            return JNI_ERR;
        }
        //注册本地native方法
        if((*env)->RegisterNatives(env, clazz, methods, NELEM(methods)) < 0)
        {
            LOGE("ERROR: MediaPlayer native registration failed
    ");
               return JNI_ERR;
        }
    
        /* success -- return valid version number */
        return JNI_VERSION_1_4;
    }
    View Code

    a. System.loadLibrary("hello-jni"); 时会调用 JNI_OnLoad

    b. RegisterNatives的第二个参数clazz包含了类的路径
    c. 定义JNINativeMethod时,第二个参数
        ()中的字符表示参数,后面表示返回值,
        "()V"----> void func()
        "(II)V"----> void func(int, int)   
    [参]http://www.cnblogs.com/keis/archive/2011/04/12/2013174.html

  • 相关阅读:
    SQL Server中的syscomments表 解析
    char(0)引起的sql2000与sql2005结果不一致
    [转]Winform精耕细作DefWndProc/WndProc/IMessageFilter的区别
    C# 操作并口类,并口通信
    [转]计算机存储单位Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB
    .net 深入系统编程(三)
    网站随记
    集训final D STL中string的应用
    icpc回顾·暑假
    ie中按钮onclick等事件失效。提示提示对象不支持此操作。在谷歌浏览器中又能使用解决办法
  • 原文地址:https://www.cnblogs.com/huozhong/p/5120977.html
Copyright © 2011-2022 走看看