@jayjayzju 写道:
Creator上手不久,因为是从C++过来的,之前没接触过JS,所以一直有个疑问,如何在Native环境下接入第三方的插件呢?JS如何和C++关联起来呢?结合论坛里的一些帖子,昨天研究了一天,终于有点成果
首先说几个点:
因为我的目标平台是iOS和Android,所以这种扩展方式无法在Browser模式下运行(Simulator估计也不行),相关调用最好加上cc.sys.isNative判断
一直以为增加自定义C++类就是定制引擎,后来才发现其实完全不需要动到引擎代码,但需要用到引擎里的自动绑定脚本
目录结构很重要,因为修改脚本和工程配置会涉及到很多相对路径,请针对自己的环境适当进行修改,不要盲目照搬。
我的根目录结构:
AAM是项目名,后面出现在路径配置的地方请自行替换成你自己的项目名
cocos2d和engine是从github上fork下来的,为了之后定制引擎用的,你如果用的内置的也没有关系
script这里只会用到js_auto_bindings.py。另外userconf.ini请添加到.gitignore里
Classes目录结构:
- 因为自动绑定生成的jsb_ql_auto.cpp里第一行引用的hpp路径是基于cocos2d/cocos/scripting/js-bindings/auo/目录的,为了和引擎分离,我在Classes下也用了一样的目录结构
下面正式开始
0、本文预期:新增一个自定义C++类,并实现一个log方法,在JS中调用后能在控制台里输出对应的日志
1、首先编写ql.h和ql.cpp两个文件
2、拷贝cocos2d/tools/tojs/cocos2dx_ui.ini,并重命名为ql.ini,并修改。具体可参考附件里,记得修改headers字段为适合自己工程结构的值。ql.ini.zip (1.4 KB)
3、拷贝cocos2d/tools/tojs/genbindings.py并放到script目录,并重命名为js_auto_bindings.py。
主要是删除了cmd_args里cocos相关的自动绑定,添加了custom_cmd_args里的配置,然后更改了output_dir(输出目录)和cfg(指向ql.ini)(请将这两个路径换成你自己的路径),详见附件。js_auto_binding.py.zip (2.0 KB)
另外如果不是和我一样的根目录结构,请修改project_root来指定cocos2d根目录,然后output_dir和cfg不能基于project_root来指定相对路径,请自行配置
4、执行自动绑定脚本
cd script python js_auto_bindings.py
成功的话你会在Classes/scripting/js-bindings/auto目录下看到三个文件:
js_ql_auto.cpp js_ql_auto.hpp api/jsb_ql_auto_api.js(此文件无用,可忽略)
5、修改Classes/AppDelegate.cpp:
// 加入头文件 #include "js_ql_autl.hpp" // 在sc->start()前添加注册 sc->addRegisterCallback(register_all_ql);
至此js绑定已经成功,接下去就是修改iOS和Android工程配置
iOS
打开proj.ios_mac下的工程
添加代码文件
- Building Settings里的User Header Search Paths添加Classes目录
- 运行编译即可看到效果
Android
- 打开编辑proj.android-studio/app/jni/Android.mk
LOCAL_SRC_FILES := hellojavascript/main.cpp \ ../../../Classes/AppDelegate.cpp \ ../../../Classes/SDKManager.cpp \ ../../../Classes/jsb_anysdk_basic_conversions.cpp \ ../../../Classes/manualanysdkbindings.cpp \ ../../../Classes/jsb_anysdk_protocols_auto.cpp \ ../../../Classes/scripting/ql.cpp \ ../../../Classes/scripting/js-bindings/auto/jsb_ql_auto.cpp LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../Classes \ $(LOCAL_PATH)/../../../Classes/scripting \ $(LOCAL_PATH)/../../../Classes/scripting/js-bindings/auto
主要是末尾添加了两个cpp文件和include目录
- 运行编译即可看到效果
最后
本文介绍了如何实现在JS里调用自定义的C++类方法,至于C++和Java、Obj-C之间的调用可在各自的Native工程上扩充即可
如有错误欢迎吐槽
帖子: 2
参与者: 1