[cpp]
jclass clazz =env->FindClass("android/hardware/Camera"); fields.post_event =env->GetStaticMethodID(clazz, "postEventFromNative", "(Ljava/lang/Object;IIILjava/lang/Object;)V"); fileds.post_event保存了Java中postEventFromNative()的jmethodID。而用到时,看如何使用:
在底层需要通知上层信息的时候会通过android.hardware.Camera::postEventFromNative()。
android_hardware_camera.cpp中,
[cpp]
JNIEnv *env =AndroidRuntime::getJNIEnv(); env->CallStaticVoidMethod(mCameraJClass,fields.post_event, mCameraJObjectWeak, msgType, ext1,ext2, NULL); Cpp中通过env->CallStaticVoidMethod()调用Java对象的方法。总结一下,c中如何访问Java对象的属性:
1) 通过JNIEnv::FindClass()找到对应的jclass;
2) 通过JNIEnv::GetMethodID()/GetStaticMethodID()找到类中属性的jfieldID;
3) 通过JNIEnv::CallAbcMethod()/CallStaticAbcMethod()调用Java对象的方法。Abc是返回值类型,可以是Int/Void/Boolean/Byte/Char/Short/Long/Float/Double/Object,如果确有返回值,在参数中返回。