gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:49:58 29 4
gpt4 key购买 nike

我正在为ObjectiveC-lua桥使用两个库。
一种是Lua官方网页提供的Lua库(带有C API)。由于那个图书馆
没有提供将objectiveC对象传递给lua的API,我选择了另一个库
为此,蜡似乎是目前的唯一选择。

该程序在调用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。

我的猜测是,问题是使用蜡_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类/函数。

最佳答案

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

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

关于ios - ObjectiveC Lua:从Lua调用C函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16901977/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com