luajit FFI LUA脚本中怎样调用C自己定义的函数

笑天居士 发布于 2014/07/30 17:29
阅读 3K+
收藏 0
Lua

C代码如下:

#include <stdio.h>
#include <luajit.h>

typedef struct foo { int a, b; } foo_t;

extern int test(int a);
extern int dofoo(foo_t *f, int n);

int test(int a)
{
  printf("a=%d\n", a);

  return 0;
}

int dofoo(foo_t *f, int n)
{
      foo_t foo = *f;

      printf("dofoo\n");

      printf("foo.a=%d,foo.b=%d\n", foo.a,foo.b);

      foo.a = 100;
      foo.b = 200;

      *f = foo;

      return 0;
}

int main(int argc, char *argv[]) {
      lua_State *L;

      L = luaL_newstate(); /*创建一个解释器句柄*/
      if (L == NULL) {
          printf("L is null1\n");
          return -1;
      }

      luaL_openlibs(L);             /*打开所有的Lua库*/

      luaL_loadfile(L,"./lua1.lua"); /*调入Lua脚本文件*/

      lua_pcall(L,0,0,0); /*执行Lua脚本*/
      lua_close(L);       /*关闭句柄*/

      return 0;
}



lua1.lua如下:

local ffi = require("ffi")

ffi.cdef[[
    int printf(const char *fmt, ...);
    typedef struct foo { int a, b; } foo_t;  // Declare a struct and typedef.
    int dofoo(foo_t *f, int n);  /* Declare an external C function. */
    int test(int a);
]]

ffi.C.printf("Hello %s!\n", "world")

local foo = ffi.new("foo_t")
foo.a = 10
foo.b = 20
ffi.C.printf("foo.a=%d\n", ffi.new("int", foo.a))
ffi.C.printf("foo.b=%d\n", ffi.new("int", foo.b))

ffi.C.testddf(new("int", 200))



我的想法就是在LUA中调用C代码中的test函数,不是用LUA C API的方式,是用LuaJIT的FFI库

我试果,如果我是调用象printf,sleep这种通用的库函数是可以的,但是调用我自己C代码中的函数,就是不型,好象有点类似找不到命名空间一样?

该怎样实现的,标准C里?

加载中
0
笑天居士
笑天居士

没人回答我

我自己试了下,我把test函数编译成一个动态库方式,然后在lua中用ffi.load(libtest)这种方式是可以调用的

难道不能直接调用C源码里的函数吗?

0
诗心客
诗心客

(1)根据个人的理解,ffi.C只能调用系统函数库(标准库)里面的函数,如stdio.h中的printf

(2)ffi.load可以加载动态链接库,如libcurl.so,或者你指定动态链接库的地址,这样加载函数库

0
ouloba
ouloba

http://blog.csdn.net/fg5823820/article/details/8888207


extern "C" __declspec(dllexport)  int test(inta)
{
  printf("a=%d\n", a); 
  return0;
}

返回顶部
顶部