lua内核使用C语言,所使用的函数也只有标准C,并且没有全局变量。对于大部分操作系统来说,移植所要做的事情很少。而移植到MTK平台则要注意以下几点:
1. 内存分配。
Lua使用malloc、realloc、calloc等函数来分配内存,而MTK平台下不能使用这些函数,而是使用OslMalloc等函数代替之。其它的分配内存函数包括以下:
#define media_get_ext_buffer(src_mod_id, buffer_p, buffer_size)/
media_get_ext_buffer_ext(src_mod_id,buffer_p, buffer_size,__FILE__,__LINE__)
#define media_get_int_buffer(src_mod_id, buffer_p, buffer_size)/
media_get_int_buffer_ext(src_mod_id,buffer_p,buffer_size,__FILE__,__LINE__)
#define media_free_int_buffer(src_mod_id, buffer_p)/
media_free_int_buffer_ext(src_mod_id, buffer_p, __FILE__, __LINE__)
#define media_free_ext_buffer(src_mod_id, buffer_p)/
media_free_ext_buffer_ext(src_mod_id, buffer_p, __FILE__, __LINE__)
mmi_frm_scrmem_alloc()
2. 文件操作。
fopne、fread、fwrite、fclose等函数也不要使用,用FS_Open、FS_Close、FS_Read、FS_Write等函数代替之。
3. 消息(事件)传递。
手机上的消息要传给lua,包括按键消息、timer消息、socket消息。
- int (*func)(void *pthis,int evtType, UINT32 param1, UINT32 param2);
- lua_State * L;
- void Key1DownHandler()
- {
- func (L,KEY_DOWN,KEY1,0);
- }
- void Key2DownHandler()
- {
- func (L,KEY_DOWN,KEY2,0);
- }
- void Key3DownHandler()
- {
- func (L,KEY_DOWN,KEY3,0);
- }
- ...................
- void KeyRSKDownHandler()
- {
- func (L,KEY_DOWN, KEY_RSK,0);
- }
- void KeyRSKUpHandler()
- {
- func (L,KEY_UP,KEY_RSK,0);
- }
- typedef struct mtk_key_event
- {
- void (*f) ();
- int event;
- int eventType;
- }mtk_key_event;
- const mtk_key_event eventHandlerS[]=
- {
- {Key1DownHandler, KEY_1, KEY_EVENT_DOWN },
- {Key2DownHandler, KEY_2, KEY_EVENT_DOWN },
- {Key2DownHandler, KEY_2, KEY_EVENT_DOWN },
- ...................
- {KeyRSKDownHandler, KEY_RSK, KEY_EVENT_DOWN},
- {KeyRSKUpHandler, KEY_RSK, KEY_EVENT_UP},
- };
- void lua_set_key_handler(void)
- {
- for(i =0;i <sizeof(eventHandlerS)/sizeof(eventHandlerS[0]);i++)
- {
- //TODO:Clear Key Handler
- }
- for(i =0;i <sizeof(eventHandlerS)/sizeof(eventHandlerS[0]);i++)
- {
- SetKeyHandler(eventHandlerS[i].f, eventHandlerS[i].event, eventHandlerS[i].eventType);
- }
- }
- int my_event_handler(void *pthis,int evtType, UINT32 param1, UINT32 param2)
- {
- int ret = 0;
- switch (evtType)
- {
- case KEY_DOWN:
- {
- return lua_event_handler(L, evtType, param1, param2);
- }
- case INIT:
- {
- L = lua_open();
- luaL_openlibs(L);
- my_openlibs(L); // 注册 C 函数
- luaL_dofile(L, (char*)param1);
- lua_event_handler(L, evtType, param1, param2);
- }
- //TODO: other event
- }
- return 1;
- }
- unsigned int lua_event_handler(lua_State *L, int evtType, UINT32 param1, UINT32 param2)
- {
- unsigned int ret = 0;
- lua_getglobal(L,"main");
- lua_pushnumber(L, evtType);
- lua_pushnumber(L, param1);
- lua_pushnumber(L, param2);
- if(lua_pcall(L, 3, 1, 0) != 0)
- {
- const char *str;
- lua_pop(L,1);
- str = lua_tostring(L, 0);
- ret = ret;
- }
- ret = (unsigned int)lua_tonumber(L, -1);
- lua_pop(L, 1);
- return ret;
- }
4。初始化以及退出
- int init()
- {
- //TODO: allocate memory
- //TODO: entry new screen
- func = my_event_handler;
- lua_set_key_handler();
- func(0, INIT, 0, 0);
- }
- int fini()
- {
- //TODO:free memory
- //TODO: exit screen
- }