簡體   English   中英

ObjectiveC Lua:從Lua調用C函數時出錯

[英]ObjectiveC Lua: Error in C function call from Lua

我正在為ObjectiveC-lua橋使用兩個庫。 一種是Lua官方網頁提供的Lua庫(帶有C API)。 由於該庫未提供將ObjectiveC對象傳遞給lua的API,因此我為此選擇了另一個庫,Wax似乎是目前的唯一選擇。

該程序在調用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;
  }
}

測試

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)

該錯誤似乎表明在lua中找不到函數passTestObjectToC,在這種情況下不正確,因為調用luaL_openlibs(L)時該函數已注冊到lua。

我的猜測是,問題是使用蠟_實例_創建(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類/功能。

我的錯誤,上面的代碼沒有問題。 已成功調用函數passTestObjectToC,發生此錯誤是因為在passTestObjectToC內部實現,而不是在調用passTestObjectToC期間實現。

如上所述,使用Wax將iOS對象成功地從iOS傳遞到Lua。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM