cocos2d-x中lua与C++,C语言互相调用


研究他们之间的通信对我来说主要是是为了解决在lua中使用protobuff,可以把网络部分放在C++中编写,lua只要把protobuff生成的字符串转给C++网络库就可以了。其实lua与C++和与C语言的相互调用是一样,调用C++其实也是把C++的对象指针当成C语言函数指针用的。
我这里是把需要lua调用的C++方法封装到C语言函数中,然后将这个C语言函数注册进lua库中。这样lua就可以轻松调用C语言方法了,就和调用自已的lua脚本是一样一样的。
因为在cocos2d-x中现在都流行使用lua开发游戏。一直作C++,很排斥用lua脚本写来游戏。如果真要用脚本,我宁愿是

ChaiScript的C++脚本。但与自已合作的朋友们都是只精通lua脚本。

无奈之下,研究了一下lua与C++,C的相互调用。

什么也不说了,直接上代码了。
第一部分,C语言函数。
//luaCfunc.h文件,要在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,在lua中注册C语言的函数以及注册和lua调用C语言的方法.

//
// 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;
}


这里说明一下,C语言本身自已调用C语言其他文件的函数时并不用加入#include "xxx"这样的字段,只要使用extern这样的方法引用一下外部函数就可以在当前文件中调用了,C语言函数之间的连接问题全部由编译器管理了。像下边这样,是C语言调用其他C语言函数的方法前的引用,当然这个方法也可以是在.cpp文件里实现的C语言。这就是C语言调用C++和C++调用C语言的法宝。
 extern const char* getLuaCallCppPath();

//CCallCppTool.hpp,C语言调用C++的工具头文件,

   
   
#ifndef LuaCallCppTool_hpp
#define LuaCallCppTool_hpp

#include <stdio.h>

extern "C" {
    const char* getLuaCallCppPath();
}
const char* getLuaCallCppPath();
#endif /* LuaCallCppTool_hpp */
上边的代码中,你会发现多了一个
extern "C" {
    const char* getLuaCallCppPath();
}
这个其实是为了告诉C编译器这个文中包含的C语言部分。extern "C" { }中包含的部分只对C语言编译器可见,所以这里看起来好像定义了两次。
//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();
}

然后还有一部分是在初始化应用程序时要初始化一下lua脚本。所以在移动应用开发的程序起动时运行的方法,也就是
 bool AppDelegate::applicationDidFinishLaunching()
方法中,我加入了我的C语言初始化lua脚本的部分。
调用之前,先要引用一下这个函数。像下边这样在cpp文件中引用C语言的函数。

extern "C" {
#include "luaCFunc.h"
}

然后就是在 bool AppDelegate::applicationDidFinishLaunching()中调用

loadLuaScript(L);

来初始化lua脚本。
最后的部分是我们的lua脚本了,这里使用截图吧,有lua的语法高亮:
cocos2d-x中lua与C++,C语言互相调用 - ♂苹果 - 眼睛想旅行
 
用的cocos2d-x版本是3.8.1。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值