在LuaJIT中,通过fii库加载so,并调用so中的函数,但是在加载的so中,通过extern定义了一些方法使用的变量。比如这个结构体的实际定义是在另一个so文件中。这时候加载so会报undefined symbol:这个问题怎么解决?
local ffi = require("ffi")
print("start test:")
package.cpath = package.cpath .. ";/data/system2.so"
ffi.cdef[[
typedef enum
{
E_DEBUG_LEVEL_ERR,
E_DEBUG_LEVEL_WARNING,
E_DEBUG_LEVEL_NOTICE,
E_DEBUG_LEVEL_INFO,
E_DEBUG_LEVEL_MAX
}DebugLevel_E;
typedef enum
{
COMRET_SUCCESS = 0,
COMRET_INTERNAL_ERROR = 1,
COMRET_INVALID_ARGUMENTS = 2,
COMRET_RESOURCE_EXCEEDED = 3,
COMRET_LOCK_TIMEOUT = 4,
COMRET_MAX
} ComRet;
typedef void json_object;
extern g_eDebugLevel;
ComRet Reboot(json_object *jsonSend);
]]
local example = ffi.load("/data/system2.so",true)
local jsonSend = ffi.new("json_object")
local ret = example.Reboot(jsonSend)
if ret == ffi.C.COMRET_SUCCESS then
local jsonString =
ffi.string(ffi.C.json_object_to_json_string(jsonSend))
print("JSON Object content:", jsonString)
else
print("Reboot failed or invalid return value")
end
这个结构体的实际定义在另一个so文件中
FFI 无法从 so 文件读取结构定义。
您必须在
ffi.cdef
参数中明确指定结构的完整详细信息。您可以定义一个不透明的结构(通过指定缺乏定义的前向声明)
typedef struct json_object json_object;
接收在其他地方创建的此类对象就足够了,但是您将无法使用
ffi.new
创建这种类型的对象。
有时创建一个足够大的内存块(例如,
ffi.new"uint64_t[1000]"
或类似的东西)足以容纳结构未知的对象。