1.JNI结构体指针及用法
在C中是二级指针,在C++中是一级指针。指向一堆定义好的函数(详情见oralcle官网https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp9502 ),我们只需拿到JNIEnv的指针即可调用足够量的函数,沟通java和c层的代码。
C中调用示例:
JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
if (mid == 0) return;
(*env)->CallVoidMethod(env, obj, mid, depth);
}
C++中调用示例:
**- C++中有this指针,所以方法中不用传入env **
JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(cls, "callback", "(I)V");
if (mid == 0) return;
env->CallVoidMethod( obj, mid, depth);
}
2.函数签名
a. 基本类型
源码中jvalue结构体是这样定义的,看了后面的篇章的示例后会更加明白如何应用。
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
b. 特殊字符转义(Escape Sequence)
_0XXXX (XXXX是一个Unicode字符),当XXXX字母小写时,表示一个非ASCII的字符转义。例, _0abcd vs _0ABCD,前者为转义。
1 表示 “”
_2 表示 “;”
_3 表示 “[“