注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

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

2015-11-06 15:48:33|  分类: cocos2d-x |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

研究他们之间的通信对我来说主要是是为了解决在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。
  评论这张
 
阅读(368)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017