Java与JNI层通信


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


任重而道远

你可能感兴趣的:(Java与JNI层通信)