在java中聲明的JNI的靜態方法(native static)和非靜態方法,對於底層的C/C++代碼來講是有區別的:
JNI函數的參數也由三部分組成:首先是JNIEnv*,是一個指向JNI運行環境的指針;
java
第二個參數隨本地方法是靜態仍是非靜態而有所不一樣一一非靜態本地方法的第二個參數是對對象的引用,而靜態本地方法的第二個參數是對其Java類的引用;
其他的參數對應一般Java方法的參數,參數類型須要根據必定規則進行映射。函數
jclass clazz = NULL;
JNIEnv* env = NULL;
//一、JNI回調靜態方法: 不須要對象實例,只須要拿到class便可
void jniCallUnStaticMethod()
{
getJNIEnv(&env);
clazz = env->FindClass("com.test.Test");
jmethodID method = env->GetStaticMethodID(clazz, "staticTestMethod", "(I)V");
env->CallStaticVoidMethod(clazz, method, channel);
}
//二、JNI回調非靜態方法: 須要class及其一個實例,可經過以下方式註冊一個實例。
jobject initedObj = NULL;
jboolean com_test_Test_nInit(JNIEnv *env, jobject thiz)
{
initedObj = thiz;
return true;
}
void jniCallUnStaticMethod()
{
getJNIEnv(&env);
clazz = env->FindClass("com.test.Test");
jmethodID method = env->GetMethodID(clazz, "unStaticTestMethod", "(I)V");
env->CallVoidMethod(initedObj, method, channel);
}spa