ChaiScript的C++脚本。但与自已合作的朋友们都是只精通lua脚本。
无奈之下,研究了一下lua与C++,C的相互调用。
//luaCfunc.c,在lua中注册C语言的函数以及注册和lua调用C语言的方法.#ifndef luaCFunc_h
#define luaCFunc_h
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int loadLuaScript(lua_State* Ltmp);
int luaCallCpp(lua_State* L);
int cppCallLua(int ptype,const char* msg,int isPush);
#endif /* luaCFunc_h */
//
// luaCFunc.c
// luatest
//
#include "luaCFunc.h"
//testlua.c
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
extern const char* getLuaCallCppPath();
lua_State* L;
int netSend(lua_State* L)
{
//从L栈中取出索引为1的数值,并检查
int x = luaL_checkint(L,1);
//从L栈中取出索引为2的数值,并检查
const char* y = luaL_checkstring(L,2);
printf("result:%d,str=%s\n",x,y);
return 1;
}
int loadLuaScript(lua_State* Ltmp)
{
L = Ltmp;
//初始化全局L
//打开库
luaL_openlibs(L);
//把函数压入栈中
lua_pushcfunction(L, netSend);
//设置全局ADD
lua_setglobal(L, "NetSend");
printf("lua path=%s\n",getLuaCallCppPath());
//加载我们的lua脚本文件
if (luaL_loadfile(L,getLuaCallCppPath()))
{
printf("error\n");
}
//安全检查
lua_pcall(L,0,0,0);
return 0;
}
int cppCallLua(int ptype,const char* msg,int isPush)
{
//push进lua函数
lua_getglobal(L, "NetRecive");
lua_pushnumber(L, ptype);
lua_pushstring(L, msg);
lua_pushboolean(L, isPush);
if (lua_pcall(L, 3, 0, 0) != 0)
{
printf("error running function netrecive\n");
}
printf("lua p=%d,%s,%d\n",ptype,msg,isPush);
printf("hello my lua\n");
return 0;
}
//CCallCppTool.hpp,C语言调用C++的工具头文件,
#ifndef LuaCallCppTool_hpp#define LuaCallCppTool_hpp
#include <stdio.h>
extern "C" {const char* getLuaCallCppPath();}const char* getLuaCallCppPath();#endif /* LuaCallCppTool_hpp */
//CCallCppTool.cpp,实现文件,是一个cpp中的C语言函数.
#include "LuaCallCppTool.hpp"
#include "cocos2d.h"
const char* getLuaCallCppPath()
{
std::string strtmp = cocos2d::FileUtils::getInstance()->fullPathForFilename("src/luaCtool.lua");
return strtmp.c_str();
}
然后就是在 bool AppDelegate::applicationDidFinishLaunching()中调用extern "C" {
#include "luaCFunc.h"
}
来初始化lua脚本。loadLuaScript(L);