3 Star 10 Fork 1

nobodies / BIN_LuaBind

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

BIN_LuaBind

BIN_LuaBind是一个和luabind、tolua++类似的库,提供了简洁的C/C++到lua的绑定机制,但与之不同的是BIN_LuaBind比他们更安全: lua层不在直接依赖于C/C++层指针,避免野指针引起宕机。除此之外,BIN_LuaBind对Lua提供了对lua_state,user data和table的抽象类,在C++端能方便的操作lua。BIN_LuaBind已经在大型的MMORPG游戏中得到应用,实现游戏脚本引擎。

功能

  • C/C++ to Lua Bind机制
  • 模块Bind
  • 类Bind
  • C++继承类Bind
  • lua handle封装
  • table封装
  • userdata封装
  • Bind机制支持自定义类型

集成

1: 下载源码
2: 直接使用bin目录下头文件和库文件,lib目录下包含lua的头文件和库文件
3: 或者直接使用自带的VS工程,生成lib文件

目录结构

  • src : BIN_LuaBind源码
  • lib : BIN_LuaBind依赖库
  • bin : BIN_LuaBind头文件和库文件
  • test : 功能测试源码
  • example : 例子源码
  • script : 功能测试使用的脚本文件

文档

Bind机制

使用BIN_LuaBind,需要先在C/C++层建立需要导出到脚本的模块或者类定义(注意:不是C++类定义),这个过程通过提供的BEGIN_SCRIPT_MODULE,BEGIN_SCRIPT_CLASS进行定义。然后通过Exporter Manager将需要的模块和类导出到Script Handle或者Script Table里面,这个过程通过ScriptExporterManager().Export和ScriptExporterManager().ExportTo完成。
采用这种方式,在C/C++层包含了整个定义的结构,可根据需要将不同的模块和类导出到不同的Script Handle和Script Table,避免总是将所有的定义都导出到Lua层。

C++对象和Lua对象关联机制

Lua层和C++层的对象采用了中间层进行隔离,因此Lua不会直接依赖C++对象指针,C++也不会直接依赖Lua的Ref,这保证了代码层面的安全性。C++对象销毁后,Lua层不会保留对象野指针;Lua对象回收后,C++层不会调用到未知的对象上去。

Module定义

BEGIN_SCRIPT_MODULE : 开始定义一个Module
END_SCRIPT_MODULE : 结束定义一个Module
DEFINE_MODULE_FUNCTION : 定义一个Module Function

BEGIN_SCRIPT_MODULE(moduleName)
	DEFINE_MODULE_FUNCTION(moduleFunction,  returnType, (argumentList))
	{
		return 1;
	}
END_SCRIPT_MODULE()

Class定义

DECLARE_SCRIPT_CLASS : 声明一个C++ Class为Script Class
BEGIN_SCRIPT_CLASS : 开始定义一个Script Class
END_SCRIPT_CLASS : 结束定义一个Script Class
DEFINE_CLASS_FUNCTION : 定义一个Class Member Function
DEFINE_STATIC_FUNCTION : 定义一个Class Static Function

class CClass
{
	DECLARE_SCRIPT_CLASS()
public:
	CClass()
	{
	}

	~CClass()
	{
	}

	void Func()
	{
	}
};

BEGIN_SCRIPT_CLASS(className, CClass)
	DEFINE_CLASS_FUNCTION(functionName, returnType, (argumentList))
	{
		return 1;
	}

	DEFINE_CLASS_FUNCTION(func, void, ())
	{	
		obj->Func();
			
		return 1;
	}

	DEFINE_STATIC_FUNCTION(newInstance, CClass*, ())
	{		
		r = new CClass();

		return 1;
	}
END_SCRIPT_CLASS()

Class继承定义

DECLARE_SCRIPT_SUB_CLASS : 声明一个Class作为Sub Script Class
SUPER_CLASS : 定义中声明Script Class的Script Super Class

class CSub : public CClass
{
	DECLARE_SCRIPT_SUB_CLASS(CClass);
}

BEGIN_SCRIPT_CLASS(subClassName, CSub)
	SUPER_CLASS(superClassName, CClass)
	DEFINE_CLASS_FUNCTION(func, void, ())
	{
		return 1;
	}
END_SCRIPT_CLASS()

C++对象生命期管理

对于导出到Lua的C++对象,生命期有两种管理方式:

  • Lua拥有 SCRIPT_OWN_OBJECTS : 生命由Lua管理,当lua对象被回收时,C++对象被销毁
  • Lua使用 SCRIPT_USE_OBJECTS : 生命由C++管理,Lua层充当使用者
    SCRIPT_OWN_OBJECTS对应的userdata被放到weak表里面,SCRIPT_USE_OBJECTS的userdata被放到strong表里面;无论哪种方式,只要C++层销毁了对象,lua层引用的C++对象为空,可通过obj:imported()来检查一个对象是否是导出的(C++对象没有被销毁)
The MIT License (MIT) Copyright (c) 2015 Yang G Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

BIN_LuaBind是一个和luabind、tolua++类似的库,提供了简洁的C/C++到lua的绑定机制,但与之不同的是BIN_LuaBind比他们更安全:lua层不在直接依赖于C/C++层指针,避免野指针引起宕机。除此之外,BIN_LuaBind对Lua提供了对lua_state,user data和table的抽象类,在C++端能方便的操作lua 展开 收起
C
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/nobodies/BIN_LuaBind.git
git@gitee.com:nobodies/BIN_LuaBind.git
nobodies
BIN_LuaBind
BIN_LuaBind
master

搜索帮助

14c37bed 8189591 565d56ea 8189591