使用luajit和fii库遇到问题

问题描述 投票:0回答:1

在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
lua ffi luajit .so
1个回答
0
投票

这个结构体的实际定义在另一个so文件中

FFI 无法从 so 文件读取结构定义。
您必须在

ffi.cdef
参数中明确指定结构的完整详细信息。
通常这可以通过调整头文件中的定义来完成。

您可以定义一个不透明的结构(通过指定缺乏定义的前向声明)

typedef struct json_object json_object;

接收在其他地方创建的此类对象就足够了,但是您将无法使用

ffi.new
创建这种类型的对象。

有时创建一个足够大的内存块(例如,

ffi.new"uint64_t[1000]"
或类似的东西)足以容纳结构未知的对象。

© www.soinside.com 2019 - 2024. All rights reserved.