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

68 阅读1分钟

#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 #include

//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中准备好的函数的;**
  
<br>
##关于this
- **this在Java中是指调用者本身的一个实例,
而在jni中,传的this则是struct `_JNIEnv`的上下文,
即传的就是上例中说道的`一级结构体指针`:
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0bb70d38c94e4f23892280ef6d176aed~tplv-k3u1fbpfcp-zoom-1.image)
则使用JNI时候,便可以有这样的写法:![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/54e6a19c19354000b7ed900ca26fc22e~tplv-k3u1fbpfcp-zoom-1.image)**


<br><br><br><br><br><br><br><br>

---

- [参考资料(《菜鸟窝》)](https://www.cniao5.com/course/lessons/10204)