首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjectiveC Lua:从Lua调用C函数时出错

ObjectiveC Lua:从Lua调用C函数时出错
EN

Stack Overflow用户
提问于 2013-06-04 01:00:57
回答 1查看 814关注 0票数 2

我为objectiveC-lua桥使用了两个库。一个是Lua官方网页提供的Lua库(带有C API)。由于该库不提供将objectiveC对象传递给lua API,因此我选择了另一个库来实现此目的,而Wax似乎是目前唯一的选择。

此程序在调用runLua()时启动,它将在其中调用test.lua

iOS实现

代码语言:javascript
复制
-(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

代码语言:javascript
复制
local testObject = myLib.newiOSObjWithName("TestObject")
testObject:setObjectLength(3.6)
myLib.passTestObjectToC(testObject) 

执行第一行和第二行没有问题,只有第三行出现错误。

错误

代码语言:javascript
复制
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。

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

C实现如下所示。

C实现

代码语言:javascript
复制
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

代码语言:javascript
复制
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类/函数。

EN

回答 1

Stack Overflow用户

发布于 2013-06-07 09:41:11

我的错误,上面的代码没有问题。函数passTestObjectToC调用成功,出现错误的原因是在passTestObjectToC内部实现,而不是在调用passTestObjectToC的过程中。

如上所述,使用Wax成功地将iOS对象从iOS传递到Lua。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16901977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档