这里以android_view_PointerIcon.cpp的函数getSystemIcon为例。
1、在gPointerIconClassInfo的结构体中,定义了jmethodID getSystemIcon,并且在
register_android_view_PointerIcon中进行初始化设置;
static struct {
jclass clazz;
jfieldID mStyle;
jfieldID mBitmap;
jfieldID mHotSpotX;
jfieldID mHotSpotY;
jmethodID getSystemIcon;
jmethodID load;
} gPointerIconClassInfo;
int register_android_view_PointerIcon(JNIEnv* env) {
FIND_CLASS(gPointerIconClassInfo.clazz, "android/view/PointerIcon");
GET_FIELD_ID(gPointerIconClassInfo.mBitmap, gPointerIconClassInfo.clazz,
"mBitmap", "Landroid/graphics/Bitmap;");
GET_FIELD_ID(gPointerIconClassInfo.mStyle, gPointerIconClassInfo.clazz,
"mStyle", "I");
GET_FIELD_ID(gPointerIconClassInfo.mHotSpotX, gPointerIconClassInfo.clazz,
"mHotSpotX", "F");
GET_FIELD_ID(gPointerIconClassInfo.mHotSpotY, gPointerIconClassInfo.clazz,
"mHotSpotY", "F");
GET_STATIC_METHOD_ID(gPointerIconClassInfo.getSystemIcon, gPointerIconClassInfo.clazz,
"getSystemIcon", "(Landroid/content/Context;I)Landroid/view/PointerIcon;");
GET_METHOD_ID(gPointerIconClassInfo.load, gPointerIconClassInfo.clazz,
"load", "(Landroid/content/Context;)Landroid/view/PointerIcon;");
return 0;
}
GET_STATIC_METHOD_ID(gPointerIconClassInfo.getSystemIcon, gPointerIconClassInfo.clazz,
"getSystemIcon", "(Landroid/content/Context;I)Landroid/view/PointerIcon;");
第一个传入参数会被初始化为java层的getSystemIcon引用,第三个参数即是java层函数名,第四个是java层函数的输入输出参数描述
2、register_android_view_PointerIcon是在AndroidRuntime.cpp中运行的;
extern int register_android_view_PointerIcon(JNIEnv* env);
static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_view_MotionEvent),
REG_JNI(register_android_view_PointerIcon),
REG_JNI(register_android_view_VelocityTracker),
};
3、使用:
jobject android_view_PointerIcon_getSystemIcon(JNIEnv* env, jobject contextObj, int32_t style) {
jobject pointerIconObj = env->CallStaticObjectMethod(gPointerIconClassInfo.clazz,
gPointerIconClassInfo.getSystemIcon, contextObj, style);
if (env->ExceptionCheck()) {
ALOGW("An exception occurred while getting a pointer icon with style %d.", style);
LOGW_EX(env);
env->ExceptionClear();
return NULL;
}
return pointerIconObj;
}