Java与JNI层通信
2019-06-02 本文已影响29人
gczxbb
javah命令生成的h文件中,每一个native方法的参数都包含JNIEnv *指针类型和jobject类型,当native方法无参数时,h文件自动生成的声明中将只有这两个参数。
JNIEXPORT jstring JNICALL Java_com_jni_app_JniCls_nativeGetStrFromJNI
(JNIEnv *, jobject);
JNIEnv类型,代表Java环境,该类提供了一些方法,可以操作Java层代码。
jobject类型,代表Java层调用native方法类的对象实例。若是静态native方法,代表Java层调用native方法类的Class实例。
jclass类型,代表Java中某个类的Class对象。
JNI的类型
类型名称 | Java层对应 |
---|---|
jint | int |
jlong | long |
jbyte | byte |
jboolean | boolean |
jchar | char |
jshort | short |
jfloat | float |
jdouble | double |
jobject | Object |
JNIEnv方法
GetObjectClass方法,查找Java层对象的Class类实例。
GetMethodID,查找Java层方法。。
CallXxxMethod,调用Java层的方法,Xxx代表返回返回的类型。
NewObject,创建Java类的对象。
GetXxxField,获取Java类中类型是Xxx的字段的值。
SetXxxField,获取Java类中类型是Xxx的字段值。
查找Java层对象的Class类实例。
jclass (*GetObjectClass)(JNIEnv*, jobject);
根据方法名,查找Java层中类Class中的方法。
jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
调用Java层的方法。jmethodID根据GetMethodID方法获取。每一种类型都包含三个方法。
jobject (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
jobject (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jobject (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
jboolean (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
jboolean (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
jboolean (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
...
可变参数,jvalue是一个union联合体,根据赋值可以定义成任何种类型。
Jave层字符串和jstring
任重而道远