lua调用c函数,skynet的require是否有问题,我用c++注册的函数,lua调用时全为nil,需要把table的key全变小写,再来调用才行 #2028
Closed
sunny-sketch
started this conversation in
General
Replies: 1 comment
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
myLua.h
#ifndef MYLUA_H
#define MYLUA_H
class myLua
{
public:
myLua();
~myLua();
int add(int a, int b);
};
#endif //
myLua.cpp
#include "myLua.h"
myLua::myLua() {}
myLua::~myLua() {}
int myLua::add(int a, int b)
{
return a + b;
}
myLua_lua.cpp
#include <lua.hpp>
#include "myLua.h"
#include
static int lua_myLua_new(lua_State *L)
{
myLua *obj = static_cast<myLua *>(lua_newuserdata(L, sizeof(myLua)));
if (obj == nullptr)
{
return 0;
}
new (obj) myLua(); // 定位 new 操作
if (luaL_getmetatable(L, "myLua") == 0)
{
return 0;
}
lua_setmetatable(L, -2);
return 1;
}
static int lua_myLua_add(lua_State *L)
{
myLua *obj = static_cast<myLua *>(luaL_checkudata(L, 1, "myLua"));
if (obj == nullptr)
{
return 0;
}
int result = obj->add(luaL_checkinteger(L, 2), luaL_checkinteger(L, 3));
lua_pushinteger(L, result);
return 1;
}
static int lua_myLua_gc(lua_State *L)
{
myLua *obj = static_cast<myLua *>(luaL_checkudata(L, 1, "myLua"));
if (obj == nullptr)
{
return 0;
}
delete obj;
return 0;
}
static const luaL_Reg myLua_lib[] = {
{"new", lua_myLua_new},
{"add", lua_myLua_add},
{"__gc", lua_myLua_gc},
{NULL, NULL}};
extern "C" int luaopen_myLua(lua_State *L)
{
if (!luaL_newmetatable(L, "myLua"))
{
return 0;
}
luaL_setfuncs(L, myLua_lib, 0);
lua_pushvalue(L, -1);
}
编译的命令是:g++ -shared -fPIC -Wall -O0 -g -o ../skynet/luaclib/myLua.so myLua_lua.cpp myLua.cpp -I../skynet/3rd/lua -I. -L../skynet/3rd/lua -llua
test.lua
local test=require "myLua"
print("test.new:",test.new)//这里打印是nil,也就是说直接调用会报错
local myLua={}
//把test的key转成小写才能正确调用
for k, v in pairs(test) do
local lowerK = string.lower(k)
myLua[lowerK]=v;
end
local newObj=myLua:new()
local result=myLua.add(newObj,7,1222)
print(result)
Beta Was this translation helpful? Give feedback.
All reactions