mre应用和Native的交互之消息传递

mre应用和native的新增API接口可以实现mre单方面的调用native的代码,那如何实现native端调用mre里面的接口呢?比如现在来电话了,mre应用里面就对应的有些逻辑要处理,来电话了是native端的实时监控,这时native端怎么调用到mre里面的代码呢?可以通过向mre应用发送消息。

现在以mtk 50_11BW1224_FTE的版本为基础,实现在主菜单进入短信服务时,便启动mre应用test.vxp,然后向其发送MESSAGE_ENTRY消息。test.vxp接收到MESSAGE_ENTRY,然后输出”进入短息服务“到屏幕上。

1、找到\plutommi\mmi\UnifiedMessage\UnifiedMessageSrc\uminterface.c 里面的void mmi_um_entry_main_message_menu(void)函数,这个函数就是进入短信服务界面的入口点了,这里修改mmi_um_entry_main_message_menu成如下,


#include "TimerEvents.h"
#include "vmpromng.h"
#include "Conversions.h"
#include "vmappcomm_sdk.h"
#include "vmio.h"

//自定义消息值
#define MESSAGE_ENTRY 210

static void mmi_send_msg_timer_func(void)      
{
    U8* filepath = "E:\\mre\\test.vxp";
    U16 w_filepath[256] = {0};
    S32 mre_app_handle = 0;

    mmi_chset_convert(MMI_CHSET_GB2312, MMI_CHSET_UCS2, (U8*)filepath, (U8*)w_filepath, 256);
    StopTimer(AVATAR_DELAY_DECODE_0);
    mre_app_handle = srv_mre_get_running_handle(w_filepath);
    if(mre_app_handle > 0)
    {
        srv_mre_send_msg(mre_app_handle,MESSAGE_ENTRY, NULL, NULL); //发送消息
    }
}

void mmi_um_entry_main_message_menu(void)
{
        U8* filepath = "E:\\mre\\test.vxp";//test.vxp的存放路径,这里是放在T卡mre下
        U16 w_filepath[256] = {0};
        VMFILE fd = 0;

        mmi_chset_convert(MMI_CHSET_GB2312, MMI_CHSET_UCS2, (U8*)filepath, (U8*)w_filepath, 256);
        fd = vm_file_open(w_filepath, MODE_READ, 0);
        vm_file_close(fd);
        
        if(fd >= 0)
        {
            vm_start_app(w_filepath, GRP_ID_ROOT, 1);//启动vxp
            if(mmi_sms_is_new_msg_come())
            {
                mmi_sms_set_new_msg_come(FALSE);
                //启动vxp是用timer启动的,而消息必须在vxp运行
                //起来后才能发送,故发消息也用timer延迟
                StartTimer(AVATAR_DELAY_DECODE_0, 500, mmi_send_msg_timer_func);
            }
            return;
        }
}
2、mre应用如何接受处理MESSAGE_ENTRY消息

首先要在vm_main里面为注册一个消息处理函数,下面的vm_reg_msg_proc(handle_msg);既是将handle_msg这个函数注册成为消息处理函数了。


void vm_main(void) {
	/* initialize layer handle */
	layer_hdl[0] = -1;	
	
	/* register system events handler */
	vm_reg_sysevt_callback(handle_sysevt);
	
	/* register keyboard events handler */
	vm_reg_keyboard_callback(handle_keyevt);
	
	/* register pen events handler */
	vm_reg_pen_callback(handle_penevt);

	vm_reg_msg_proc(handle_msg);

	/* Init MRE resource */
	vm_res_init();
}
消息处理,在handle_msg这个函数中处理消息#define MESSAGE_ENTRY 210,这里需要保证native和mre应用中的两个消息值一致

#define MESSAGE_ENTRY 210

VMINT handle_msg(VM_P_HANDLE sender, VMUINT msg_id, VMINT wparam, VMINT lparam)
{
	switch (msg_id)
	{
	case MESSAGE_ENTRY:
		{
			VMWCHAR wstr[256] = {0};
			vm_gb2312_to_ucs2(wstr, 256, "进入短信服务!");
			draw_text(wstr);
			break;
		}
	}
	return 0;
}



posted @ 2012-07-19 17:06  $逝水无痕$  阅读(288)  评论(0编辑  收藏  举报