美文网首页音视频
Java与JNI层通信

Java与JNI层通信

作者: gczxbb | 来源:发表于2019-06-02 00:08 被阅读29次

    javah命令生成的h文件中,每一个native方法的参数都包含JNIEnv *指针类型和jobject类型,当native方法无参数时,h文件自动生成的声明中将只有这两个参数。

    JNIEXPORT jstring JNICALL Java_com_jni_app_JniCls_nativeGetStrFromJNI
      (JNIEnv *, jobject);
    

    JNIEnv类型,代表Java环境,该类提供了一些方法,可以操作Java层代码。
    jobject类型,代表Java层调用native方法类的对象实例。若是静态native方法,代表Java层调用native方法类的Class实例。
    jclass类型,代表Java中某个类的Class对象。

    JNI的类型

    类型名称 Java层对应
    jint int
    jlong long
    jbyte byte
    jboolean boolean
    jchar char
    jshort short
    jfloat float
    jdouble double
    jobject Object

    JNIEnv方法

    GetObjectClass方法,查找Java层对象的Class类实例。
    GetMethodID,查找Java层方法。。
    CallXxxMethod,调用Java层的方法,Xxx代表返回返回的类型。
    NewObject,创建Java类的对象。
    GetXxxField,获取Java类中类型是Xxx的字段的值。
    SetXxxField,获取Java类中类型是Xxx的字段值。

    查找Java层对象的Class类实例。

    jclass      (*GetObjectClass)(JNIEnv*, jobject);
    

    根据方法名,查找Java层中类Class中的方法。

    jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
    

    调用Java层的方法。jmethodID根据GetMethodID方法获取。每一种类型都包含三个方法。

    jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
    jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
    jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
    jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
    ...
    

    可变参数,jvalue是一个union联合体,根据赋值可以定义成任何种类型。

    Jave层字符串和jstring


    任重而道远

    相关文章

      网友评论

        本文标题:Java与JNI层通信

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