2013-06-03 94 views
2

我正在为objectiveC-lua桥使用两个库。 一个是Lua官方网页提供的Lua库(含C API)。由于该库 未提供API以将objectiveC对象传递给lua,因此我为此选择了另一个库 ,而Wax似乎是目前唯一的选择。ObjectiveC Lua:来自Lua的C函数调用错误

该程序启动时runLua()被调用时,它会调用test.lua

iOS的实施

-(void) runLua{ 
    [self initLua]; 
    [self invokeLua:@"require test"]; 
} 

-(void)initLua{ 

    // initialize Lua and our load our lua file 
    L = luaL_newstate(); // create a new state structure for the interpreter 
    luaL_openlibs(L); // load all the standard libraries into the interpreter 

    lua_settop(L, 0); 

    initDone = TRUE; 
} 

-(void) invokeLua:(NSString*)luaSrcStr{ 
    //NSLog(@"%@",luaSrcStr); 

    if(!initDone){ 
     NSLog(@"inside invokeLua: not yet init"); 
     [self initLua]; 
    } 

    lua_settop(L, 0); 
    int ok = luaL_loadstring(L, [luaSrcStr UTF8String]); 
    if(ok == 0){ 

    lua_getglobal(L,"debug"); 
    lua_getfield(L,-1, "traceback"); 
    lua_remove(L,-2); 
    lua_insert(L,-2); 

    ok = lua_pcall(L, 0, 0, -2); 

    if (ok != 0){ 
     luaL_error(L, "cannot run lua file: %s", 
        lua_tostring(L, -1)); 

    return; 
    } 
} 

test.lua

local testObject = myLib.newiOSObjWithName("TestObject") 
testObject:setObjectLength(3.6) 
myLib.passTestObjectToC(testObject) 

有没有问题,在执行第一行和第二行,只有第三行,发生错误。

错误

PANIC: unprotected error in call to Lua API (cannot run lua file: attempt to index a nil 
value stack traceback: 
[C]: in function 'passTestObjectToC' 
...-451C-9F1D-9CE481B4F9A0/test.app/test.lua:6: in main chunk 
[C]: in function 'require' 
[string "..."]:3: in main chunk) 

的错误似乎表明该函数passTestObjectToC没有在Lua,在这种情况下,该功能被注册到Lua时luaL_openlibs(L)被称为是不是真的找到。

我的猜测,问题来了,使用wax_instance_create(luaState * L,...)将objectiveC对象传递给lua。传递对象后,Wax可能已经更改了luaState * L,它不记得passTestObjectToC已经注册。

C实现如下。

C实现

static int newiOSObjWithName(lua_State *L){ 
    NSString *className = [NSString stringWithCString:lua_tostring(L, -1) 
          encoding:NSUTF8StringEncoding]; 
    className = [className stringByReplacingCharactersInRange:NSMakeRange(0,1) withString: 
       [[className substringToIndex:1] uppercaseString]]; 
    id classId = [[NSClassFromString(className) alloc] init]; 

    luaopen_wax_instance(L); 
    wax_instance_create(L, classId, YES); 

    return 1; 
} 

static int passTestObjectToC(lua_State *L){ 
    // something to be done here 

    return 0; 
} 

static const struct luaL_Reg myLib [] = { 
    {"newiOSObjWithName", newiOSObjWithName}, 
    {"passTestObjectToC", passTestObjectToC}, 
    {NULL, NULL} 
} 

int luaopen_mylib (lua_State *L){ 
    luaL_register(L, "myLib", myLib); 
    return 1; 
} 

的Lua库的linit.c

static const luaL_Reg lualibs[] = { 
    {"", luaopen_base}, 
    {LUA_LOADLIBNAME, luaopen_package}, 
    {LUA_TABLIBNAME, luaopen_table}, 
    {LUA_IOLIBNAME, luaopen_io}, 
    {LUA_OSLIBNAME, luaopen_os}, 
    {LUA_STRLIBNAME, luaopen_string}, 
    {LUA_MATHLIBNAME, luaopen_math}, 
    {LUA_DBLIBNAME, luaopen_debug}, 
    {"myLib", luaopen_mylib}, 
    {NULL, NULL} 
}; 


LUALIB_API void luaL_openlibs (lua_State *L) { 
    const luaL_Reg *lib = lualibs; 
    for (; lib->func; lib++) { 
    lua_pushcfunction(L, lib->func); 
    lua_pushstring(L, lib->name); 
    lua_call(L, 1, 0); 
    } 
} 

谁能告诉我,为什么是passTestObjectToC调用错误?是什么原因?

没有可用于传递iOSObject的Wax实现的示例。我没有找到它。 所以我不确定这是否是正确的做法。大多数示例使用Wax直接在Lua脚本中实现iOS类/函数。

回答

0

我的错误,上面的代码没有问题。函数passTestObjectToC被成功调用,由于passTestObjectToC内部的实现而发生错误,而不是在调用passTestObjectToC期间发生。

如上所述,iOS对象已成功从iOS传递给使用蜡的Lua。