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程序中程序和变量的简单方法。