1.JNI結(jié)構(gòu)體指針及用法
在C中是二級指針,在C++中是一級指針秘通。指向一堆定義好的函數(shù)(詳情見oralcle官網(wǎng)https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp9502 )为严,我們只需拿到JNIEnv的指針即可調(diào)用足夠量的函數(shù),溝通java和c層的代碼肺稀。
C中調(diào)用示例:
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++中調(diào)用示例:
**- 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.函數(shù)簽名
a. 基本類型
源碼中jvalue結(jié)構(gòu)體是這樣定義的,看了后面的篇章的示例后會更加明白如何應(yīng)用话原。
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
b. 特殊字符轉(zhuǎn)義(Escape Sequence)
_0XXXX (XXXX是一個Unicode字符)夕吻,當(dāng)XXXX字母小寫時,表示一個非ASCII的字符轉(zhuǎn)義繁仁。例, _0abcd vs _0ABCD涉馅,前者為轉(zhuǎn)義。
1 表示 “”
_2 表示 “;”
_3 表示 “[“