【Tech-Lua】Cocos-2dx-Lua调用java的小白教程(二)
手把手教你如何在Win中的Cocos-2dx-Lua调用Java 网上有很多文章,说怎么Lua调用C++最佳实践,什么官网说明文档,可以这么一说,这些所谓的教程全都是断手断脚的,对于小白来说,一到了关键位置,就无从下手。所以我现在记录下我成功调用的经验,希望帮到更多的人。 这个教程分为两个部分,第一:toLua++的使用。第二:编译代码,调用代码。 一、toLua++的使用。 /frameworks/cocos2d-x/tools/tolua/README.mdown
打开这个Readme文件。分别按顺序的操作它的说明: 1.下载android-ndk-r9b python genbindings.py
我用的时3.4版本的cocos2dx。经过一段时间的运行,如果看到以下画面,证明你的配置已经成功了。接下来就是使用自定义的C++类了。 2.自定义C++类绑定Lua 2.1 wind7的cocos code IDE中新建Lua工程。 2.2 首先先构建一下工程,我构建了一下android模拟器。然后打开工程所在的目录。去到一下文件夹里面。 /frameworks/cocos2d-x/cocos/
cocos文件夹里装载的都是这个工程的全部cocos的C++源码。 2.3 在cocos文件夹中新建一个自己的文件夹。 2.4 在这个文件夹中加入自己定义的C++类和头文件.这里我直接使用网上的类和头文件,复制过来就好了。 //
// HNLuaTest.h
// cocos2d_libs
//
// Created by Eleven Chen on 14-8-5.
//
//
#ifndef __cocos2d_libs__HNLuaTest__
#define __cocos2d_libs__HNLuaTest__
#include "cocos2d.h"
#include <string>
class Test : public cocos2d::Ref {
public:
static std::string helloMsg();
static Test* create();
bool init();
static cocos2d::Vec2 left();
};
#endif /* defined(__cocos2d_libs__HNLuaTest__) */
CPP文件: //
// HNLuaTest.cpp
// cocos2d_libs
//
// Created by Eleven Chen on 14-8-5.
//
//
#include "HNLuaTest.h"
using namespace cocos2d;
std::string Test::helloMsg()
{
return "Hello from HNLuaTest::helloMsg()";
}
Test* Test::create()
{
return new Test();
}
bool Test::init()
{
return true;
}
Vec2 Test::left()
{
return Vec2(0,0);
}
2.5 通过脚本调用toLua++工具 2.5.1 . 去到工程目录下的 目标工程/frameworks/cocos2d-x/tools/tolua/
2.5.2 . 写自己类的ini文件 1.修改文件头,修改为【HNLuaTest】 以下的修改可以先暂时全部置空和不变。 2.5.4 . 写自己的py脚本。 接着修改这个genbindings_HNLuaTest.py文件。 至于为何要注释掉呢?你也可以不注释,稍后你可以比较一下注释前后的运行时间就明白了。另外一点是,前面的ini文件其实都已经被本来的genbindings.py执行过了,这里再执行一次就没有意义了。 2.5.5 运行脚本 python genbindings_HNLuaTest.py
如果报错,不成功,一定是ini文件格式有问题,或者genbindings_HNLuaTest.py文件格式问题。 2.5.6 cpp与hpp文件 //cpp文件
目标工程/frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/lua_HNLuaTest_auto.cpp
//hpp文件
目标工程/frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/lua_HNLuaTest_auto.hpp
—–@到了最坑爹的地方了@—– 因为你翻看几次那个frameworks文件夹,你就发现,其实cocos2dx的那些CPP文件都转变为了.lua文件。 ..frameworkscocos2d-xcocosscriptinglua-bindingsscript
那么我们自定义的那个c++类的.lua文件呢? 幸好,在我陷入一片无辜无助之后,我再次翻看了所有网上的文档教程,功夫不负有心人,终于给我找到大神般的教程了。 这篇教程的最后提到编译这个hpp与cpp文件,即脚本运行后得到的那个两个文件。 根据那个教程(Android集成),我把它my的文件夹,改为自己的park,将他的coustom类改为我的HNLuaTest。 但我的步骤和他所说的还是有点不一样,在修改好所有的mk文件之后,我先对这个工程进行了一次android的构建。 ...frameworkscocos2d-xcocosscriptinglua-bindingsautoapi
但你看到这个文件之后,你就放心多了,因为通过这个lua文件,你可以在lua工程直接就访问Cpp中的类了。至于这个文件的生成为何在这里,你可以去研究一下genbindings.py脚本就知道了。 得到这个文件之后,就是说Lua调用C++类可以有文件依赖了,那么所有事情开始变得顺利了。其实前面那些步骤简直繁琐到不要不要的,我在这里面整整沉溺了两天时间。一个字:“繁乱” 不知道为何那么繁乱的语言竟然都有人用的,我简直开始怀疑了发明这个人的智商。 好了,吐糟完了,由于收人钱财,替人消灾,我还是要继续下去呀。 得到这个文件之后,先可以在AppDelegate.cpp对这个文件访问以下,毕竟HNLuaTest也是一个C++类。 这样就可以了吗?我以为真的可以了。然后我点击“构建Apk”按钮。弹出打包失败。错误为: jni/../../Classes/AppDelegate.cpp:68: error: undefined reference to 'register_all_HNLuaTest(lua_State*)'
说这个方法没有定义就被引用了。噢~!!是的,我们引入lua_HNLuaTest_auto.hpp这个头文件。 打开 这些引入与注册不正是C++注册到lua中的接口吗? ..frameworkscocos2d-xcocosscriptinglua-bindingsmanual
然后参照它们的引入方式,我也把lua_HNLuaTest_auto.hpp引入到AppDelegate.cpp文件中。 included ../auto/lua_HNLuaTest_auto.hpp
好了,再重新构建一次andoid工程吧,应该会成功了吧。应该,应该,应该。~!靠···,没错,又失败了。查找了一下错误说 "lua_HNLuaTest_auto.cpp"文件中,无法找到“HNLuaTest.h”文件
为何会找不到这个头文件,为何要引入这个头文件呢?这个cpp不是已经引入了hpp头文件了嘛?还要引入HNLuaTest.h吗?带着这些疑问我去lua_HNLuaTest_auto.cpp文件中的把 终于,终于,终于,构建成功了。实在泪流满面了呀·好不容易呀·!然后就打包apk,也成功了,之后就安装到手机中·······然后下班了·!!!周五晚,就不要加班了···赶紧出去嗨·! 周一继续努力。我想既然都可以编译成这样了,理成功应该不远了,虽然过程十分繁琐,但基本原理心里有个框架了,等完全跑起来的时候 再回头看看整个步骤逻辑。为何每一步都需要完成这些修改,这些修改针对的是什么? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |