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 一般是是由虚拟机传入,而且与线程相关的变量,也就说线程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释放资源