Quantcast
Channel: Cocos中文社区 - 最新主题
Viewing all articles
Browse latest Browse all 88737

分享:在js里调用自定义的c++类方法

$
0
0

@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

阅读整个主题


Viewing all articles
Browse latest Browse all 88737

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>