1.简单说明
文中针对的嵌入式,并不包括带mmu的cpu。所以,使用lua调用so库在本文中也就不说明了。
2.简单的lua调用c
这一节说明的是简单的在lua源码中添加c函数,然后调用即可。这里面体现的就是lua调用了指定的c函数。
步骤如下:
1.在lua.c下,找到pmain函数,在luaL_openlibs()后添加如下代码块:
lua_register(L, "myadd", l_add);
const char* testfunc = "print(myadd(1.1,2.0445))";
if(luaL_dostring(L, testfunc))
printf("Failed to execute.\n");
2.在lua.c下,添加函数:
static int l_add(lua_State* L)
{
double op1 = luaL_checknumber(L,1);
double op2 = luaL_checknumber(L,2);
lua_pushnumber(L,op1 + op2);
return 1;
}
3.编译整个lua源码,并执行:
$ make c89 test
$ ./lua
3.1445
3.符合工程化的lua调用c
符合工程化的lua调用c,是指上层使用lua,而在lua的源码框架中已经包含了基本的c函数。这样能做到lua工程师与驱动工程师的分离。
具体的使用方法是参照luaL_openlibs()的实现。
例如在lua源码中添加的内容为:
int l_myaddfun(lua_State * L)
{
#if 1
double op1 = luaL_checknumber(L,1);
double op2 = luaL_checknumber(L,2);
lua_pushnumber(L,op1 + op2);
return 1;
#endif
}
static const luaL_Reg l_addfun_array[] = {
{"myaddfun", l_myaddfun},
{NULL, NULL}
};
int luaopen_addfun(lua_State * L)
{
luaL_newlib(L, l_addfun_array);
return 1;
}
static void lua_testlibs (lua_State *L) {
const luaL_Reg prelibs[] = {
{ "test.addfun", luaopen_addfun },
{ NULL, NULL },
};
const luaL_Reg * lib;
for(lib = prelibs; lib->func; lib++)
{
lua_getglobal(L, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, lib->func);
lua_setfield(L, -2, lib->name);
lua_pop(L, 2);
}
}
lua应用层源码为:
--在调用时,必须是package.function
local myfun = require("test.addfun")
--print(mytestlib.add(1.0,2.0))
print("hello world......................")
print(myfun.myaddfun(20.1,19))
网友评论