Android framwork cpp调用java function

来源:互联网 发布:手机淘宝如何注销账户 编辑:程序博客网 时间:2024/04/27 02:30
   这里以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;}


1 0
原创粉丝点击