luajit ffi 访问C动态库

时间:2022-10-30 11:09:29

1 建立动态库,与lua无关,库中的函数和全局变量供luajit调用

mylib.h

#ifdef __cplusplus
extern "C" {
#endif
   typedef struct{  
     int len;  
     char value[128];     
   }MY_STR;  
   
   typedef int (* FPROC)(MY_STR[32]);
   void printmy();
   void testAdd();
   void testNoHFile();/*如果没有放在extern中,则无法在lua中使用函数。*/
   
   int g_directOpr=0;
#ifdef __cplusplus
}
#endif

mylib.cpp

extern "C"  
{  
 #include <stdlib.h>
 #include <stdio.h> 
 #include <string.h>
 #include <errno.h>  
 #include "mylib.h"
}  

/*全局变量 即使不在头文件声明,也可以直接在lua中直接使用*/
int g_Num=100;
void printmy(){
	   printf("lib print [%d]\n",g_Num);
}

void testAdd(){
   	g_Num++;
}

void testNoHFile(){
	  printf("test no head file \n");
}
/*直接在函数前使用extern C,则可以直接在lua中访问了。不必在头文件中。*/
extern "C"  void testNoHFile2(){
	  printf("test no head file 2 \n");
}

2 建立一个bin,与lua有关

extern "C"  
{  
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>  
 #include "mylib.h"
 	
#include "/data/project/LuaJIT-2.1.0-beta2/src/lua.h"  
#include "/data/project/LuaJIT-2.1.0-beta2/src/lualib.h" 
#include "/data/project/LuaJIT-2.1.0-beta2/src/lauxlib.h" 
}  

/*int g_Num=100;定义全局变量与mylib.so中重复,则lua中直接无法操作g_Num*/

int g_clientBinNum=1000;

int main()  
{      
       lua_State *L=luaL_newstate(); /*创建一个解释器句柄*/  
       luaL_openlibs(L);             /*打开所有的Lua库*/  
          
        luaL_loadfile(L,"script.lua"); /*调入Lua脚本文件*/  
          
        lua_pcall(L,0,0,0); /*执行Lua脚本*/  
        lua_close(L);       /*关闭句柄*/  
        return 0;  
}  

3 建立lua脚本

print("case2 lua访问C中的函数和全局变量")
--三种访问库的方式都可以
--local mylib = ffi.load("/data/mytest/src/test/libmylib.so");
--local mylib = ffi.load("./libmylib.so");
local mylib = ffi.load("libmylib.so");
print("test so global variable-g_Num direct");
print(mylib.g_Num);
mylib.g_Num=mylib.g_Num+1;
print(mylib.g_Num);

print("test so global variable-g_directOpr direct");
print(mylib.g_directOpr);
mylib.g_directOpr=mylib.g_directOpr+1;
print(mylib.g_directOpr);
mylib.g_directOpr=mylib.g_directOpr+10;
print(mylib.g_directOpr);


print("test so global variable- g_Num test by func");
mylib.printmy();
mylib.testAdd();
mylib.printmy();
mylib.testAdd();
mylib.printmy();

print("test bin global variable-int g_clientBinNum");
print(g_clientBinNum);--显示nil

mylib.testNoHFile();
mylib.testNoHFile2();


1 luajit直接支持C,所以如果使用C++的.cpp,则需要在函数前使用extern C

2 ffi.load中可以直接配置路径,具体见api说明

http://luajit.org/ext_ffi_api.html

3 luajit使用动态库中的变量和函数。但没有找到直接使用bin程序中程序和变量的简单方法。