美文网首页
Tip | JNI数据类型与指针嵌套

Tip | JNI数据类型与指针嵌套

作者: 凌川江雪 | 来源:发表于2020-05-27 23:09 被阅读0次

    JNI数据类型

    • Java Type Java数据类型
    • Native Type Native层的数据类型
    • Description 描述符

    JNI里面的常量池

    JNI中的一些变量和函数

    JNI中的一些函数:
    像图中的CallObjectMethod()CallIntMethod()等这里写的这些方法其实只是一个调用而已,
    这些方法在NDK的工具集里面已经实现好了;

    JNIEnv

    //JNIEnv结构体的指针别名
    typedef struct MYJNINativeInterface_* JNIEnv;
    

    JNIEnv就是JNI获取Java对象、Java变量的一个上下文环境:

    模仿JNI写的一段程序【指针嵌套】

    #include <stdlib.h>
    #include <stdio.h>
    
    //JNIEnv结构体的指针别名
    typedef struct MYJNINativeInterface_* JNIEnv;
    
    //结构体
    struct MYJNINativeInterface_
    {
        //函数声明
        char* (*NewStringUTF)(JNIEnv*,char*);
    };
    
    //函数实现
    char* NewStringUTF(JNIEnv* env, char* str){
        //在NewStringUTF执行过程,仍然需要JNIEnv
        return str;
    }
    
    //JNIEnv  就是一级结构体指针
    //JNIEnv* 则是二级结构体指针
    void main(){
        //实例化结构体
        struct MYJNINativeInterface_ struct_env;
        struct_env.NewStringUTF = NewStringUTF;//!!!!!!!!!!
    
        //结构体指针
        JNIEnv e = &struct_env;
    
        //结构体的二级指针
        JNIEnv *env = &e;
    
        //通过二级指针调用函数;(*env)则是一级结构体指针
        char* str = (*env)->NewStringUTF(env, "test");
        printf("%s", str);
        system("pause");
    
    }
    
    • 在使用jni的时候,
      我们就是跟这案例一样,使用(*env) -> 函数名的形式,
      来调用jni、NDK中准备好的函数的;

    关于this

    • this在Java中是指调用者本身的一个实例,
      而在jni中,传的this则是struct _JNIEnv的上下文,
      即传的就是上例中说道的一级结构体指针

      则使用JNI时候,便可以有这样的写法:









    相关文章

      网友评论

          本文标题:Tip | JNI数据类型与指针嵌套

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