美文网首页
Java 调用jni方法

Java 调用jni方法

作者: 跟跟_a5e9 | 来源:发表于2017-12-04 15:15 被阅读0次

    两种实现方式

    1. Java_包名类名方法名
    2. RegisterNatives方法

    native 方法如下

    public static native String hello();
    public native String _hello();
    public native String hello_();
    

    第一种方式:在Native中应该(采用的是c++的写法)

    //第二个参数是jclass,而不是jobject
    jstring Java_com_zgg_jnidemo_JNITestActivity_hello(JNIEnv* env, jclass jobj){
      return env->NewStringUTF("Hello from JNI");
    }
    //方法名中有下划线"_",JNI中用"_1"代替"_"
    jstring Java_com_zgg_jnidemo_JNITestActivity__1hello(JNIEnv* env,jobject jobj){
      return env->NewStringUTF("Hello from JNI with pre\"_\"");
    }
    
    jstring Java_com_zgg_jnidemo_JNITestActivity_hello_1(JNIEnv* env,jobject jobj){
      return env->NewStringUTF("Hello from JNI endWith\"_\"");
    }
    

    如果想重载本地方法,这种方式是不能实现的。

    第二种方式:通过RegisterNatives方法

    jint JNI_OnLoad(JavaVM *vm, void *reserved){
        JNIEnv * env;
        //获取JNIEnv接口指针
        if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
            return JNI_ERR;
        }
        //获取要映射的Java类
        jclass clz = env->FindClass("com/zgg/jnidemo/JNITestActivity");
        if (clz == NULL) {
            return JNI_ERR;
        }
    
        if (env->RegisterNatives(clz, methods, sizeof(methods)/ sizeof(methods[0])) != JNI_OK) {
            return JNI_ERR;
        }
        return JNI_VERSION_1_4;
    }
    

    然后看下methods 是怎么定义的

    jstring hello(JNIEnv *env, jclass thiz);
    jstring _hello(JNIEnv *env, jobject thiz);
    jstring hello_(JNIEnv *env, jobject thiz);
    
    static JNINativeMethod methods[] = {
            {"hello", "()Ljava/lang/String;", (void*) hello},
            {"_hello", "()Ljava/lang/String;", (void*) _hello},
            {"hello_", "()Ljava/lang/String;", (void*) hello_},
    };
    

    最后再实现这三个方法就可以咯
    JNI映射Java方法的参数类型,见下表:

    类型签名 Java类型
    Z boolean
    B byte
    C char
    S short
    I int
    J long
    F float
    D double
    L full-qualified-class ; full-qualified-class
    [type type[]
    (arg-type)ret-type method type

    例如:Java方法

    long f(int n, String s, int[] arr);
    

    它的类型签名应该是:

    (ILjava/lang/String;[I)J
    

    相关文章

      网友评论

          本文标题:Java 调用jni方法

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