JNIEnv结构体解析

JNI作为联系Java世界和Native世界的桥梁还面临过一个很麻烦的问题,那就是Java和Native之间的数据类型转换。

数据类型转换

基本数据类型转换

Java类型 别名 C++本地类型 字节(bit)
boolean jboolean unsigned char 8, unsigned
byte jbyte signed char 8
char jchar unsigned short 16, unsigned
short jshort short 16
int jint long 32
long jlong __int64 64
float jfloat float 32
double jdouble double 64

引用数据类型转换

引用数据类型转换

可以看到比较中要的是jobject,jclass

JNIEnv

JNIEnv.jpg

解释:JNIEnv 一般是是由虚拟机传入,而且与线程相关的变量,也就说线程A不能使用线程B的 JNIEnv。而作为一个结构体它里面定义了JNI系统操作方法
比如说:

  • FindClass
  • GetMethodID
  • GetFileID

JNIEnv操作jobject

object 一般由filed 和 method 两种成员构成,顾操作object其实就是操作filed和method,

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

操作这些成员

NativeType Call<type>Method(JNIEnv *env, jobject obj, jmethodID methodID,...) //type 对应Java函数的返回值类型。
NativeType Call<type>Filed(JNIEnv *env, jobject obj, jmethodID filedID,...) //type对应Filed变量类型

jString

因为string用的比较多,顾单独创建一个jstring 类型来表示Java 中的String

NewString(JNIEnv *env, const jchar * unicodeChars, jsize len) //得到一个jstring对象
NewStirngUTF() //根据Native的UTF-8 字符串得到一个jstring对象
GetStringChar() //将JavaString 对象转换成本地字符串得到Unicode字符串
GetStringUTFChar() //得到UTF-8 字符串
ReleaseStringUTFChars() //使用完后必须调用ReleaseStringUTFChars释放资源



文章转自:https://www.jianshu.com/p/453b0463a84c,好文要顶,感谢博主分享!
 

猜你喜欢

转载自blog.csdn.net/xingkongtianma01/article/details/81114589