0x00 JNI预备知识

作者: lc_fan | 来源:发表于2018-03-16 15:55 被阅读106次

    1.JNI结构体指针及用法

    在C中是二级指针,在C++中是一级指针。指向一堆定义好的函数(详情见oralcle官网https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp9502 ),我们只需拿到JNIEnv的指针即可调用足够量的函数,沟通java和c层的代码。

    C中调用示例:

    JNIEXPORT void JNICALL
    Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
      jclass cls = (*env)->GetObjectClass(env, obj);
      jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
      if (mid == 0) return;
      (*env)->CallVoidMethod(env, obj, mid, depth);
    }
    

    C++中调用示例:

    **- C++中有this指针,所以方法中不用传入env **

    JNIEXPORT void JNICALL
    Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
      jclass cls = env->GetObjectClass(obj);
      jmethodID mid = env->GetMethodID(cls, "callback", "(I)V");
      if (mid == 0) return;
      env->CallVoidMethod( obj, mid, depth);
    }
    

    2.函数签名

    a. 基本类型

    源码中jvalue结构体是这样定义的,看了后面的篇章的示例后会更加明白如何应用。

    
    typedef union jvalue { 
    
    jboolean z; 
    
    jbyte b; 
    
    jchar c; 
    
    jshort s; 
    
    jint i; 
    
    jlong j; 
    
    jfloat f; 
    
    jdouble d; 
    
    jobject l; 
    
    } jvalue;
    
    

    b. 特殊字符转义(Escape Sequence)

    _0XXXX (XXXX是一个Unicode字符),当XXXX字母小写时,表示一个非ASCII的字符转义。例, _0abcd vs _0ABCD,前者为转义。

    1 表示 “

    _2 表示 “;”

    _3 表示 “[“

    相关文章

      网友评论

        本文标题:0x00 JNI预备知识

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