Cocos2d-JS自动JSB绑定详细使用及怎么样导入到creator中使用

什么是JSB

JSB是javascript binding的简称。Cocos2d-JS中使用的javascript引擎是Mozilla 的spidermonkey,而JSB绑定的目的就是让javascript脚本能够调用到c++代码,c++代码能够调用到javascript脚本。

环境搭建

本人以安装的Cocos Creator为2.02版本,基于windows 64位平台操作系统

1,phthon 环境(http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi)

2,增加环境变量PYTHON_ROOT设置为python安装根目录(C:\Python27)

PATH中增加环境变量%PYTHON_ROOT%;%PYTHON_ROOT%\Scripts;(说明下这个只有安装第三方的库才会在phthon安装路径下产生这个目录)

3,下载 pyyaml( http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe)并安装 

到这里,跟官方的说明文档有些不同,个人在安装其它python第三方Cheeltah的时候,遇到一些奇怪的问题,难道是我看了个假的官方文档。所以就多加了几个部分,如果你的直接安装Cheetah没有报错可以忽略掉这个部分

Markdown安装 本人安装的是(https://pypi.org/project/Markdown/3.0.1/)下载后解压执行 python setup.py install 命名安装

Setuptools安装 本人安装的是(https://pypi.org/project/setuptools/40.4.3/) 同上命令

4,下载 Cheetah-2.4.4.tar.gz, 执行 python setup.py. install

5,下载 NDK r16b安装 ,官方的说明是大于等于NDK r16 但本人安装的是NDK r16b版本的NDK

6,设置环境变量(NDK_ROOT=D:\Android\android-ndk-r16b) 

7,增加环境变量PYTHON_BIN设置为自己的python.exe,如本人设置为C:\Python27\python.exe

安装CocosCreator

这里在安装CocosCreator时注意安装目录中一定不要含有空格,本人就遇到因安装目录有空格担误了不少的时间,在执行绑定脚本时不正确的找到路径,遇到空格路径被截断了。

官方下载最新的bindings-generator

更新Cocos Creator中默认引擎的JSB

下面的内容就是具体怎么使用tojs这个工具,在安装完成CocosCreator之后 ,进入安装目录, 找到D:\CocosCreator\resources目录下的cocos2d-x ,个人建议是复制一份,不要在上面直接进行修改,免得把cocos2d-x默认的引擎改出什么问题 , Cocos Creator的windows模拟器无法正常启动。

这里复制了一分并更名为cocos2d-xcopy的引擎副本

把之前下载好的bindings-generator解压出来等待使用

由于Cocos Creator在安装完成之后,安装目录下的CocosCreator\resources\cocos2d-x\tools\bindings-generator\libclang目录下的第三方的库没有安装进来,这时我们之前下载的bindings-generator就可以拿出来了,在解压出来的bindings-generator中找到如下三个库

复制到之前我们复制出来的cocos2d-xcopy引擎的

进入tools/tojs目录

执行脚本python .\genbindings.py

此时,如果你看到如下界面,恭喜你,成功搭建了tojs环境

添加自己自定义类

修改windows平台模拟器,其它平台有空在做后续的更新

window 平台

打开runtime工程

打开D:\CocosCreator\resources\cocos2d-xcopy\tools\simulator\frameworks\runtime-src\proj.win32工程

如图:


由于我们是扩展cocos2d-x,个人建议把自己的代码都放置到external外部库中

这里就简单的写个示例,只是为了使用这个强大的tojs工具

示例代码

代码如图:


编写tojs绑定脚本

个人是以自带的cocos2dx_spine.ini作为基本修改,复制一个cocos2dx_spine.ini并更名为cocos2dx_custom.ini,修改后的文件如下:

[cocos2dx_custom]

prefix = cocos2dx_custom

target_namespace = jsb

android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.8/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.9/include

android_flags = -D_SIZE_T_DEFINED_

clang_headers = -I%(clangllvmdir)s/%(clang_include)s

clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__

cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/external/android/include -I%(cocosdir)s/external/sources

cocos_flags = -DANDROID

cxxgenerator_headers =

# extra arguments for clang

extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s

headers = %(cocosdir)s/external/sources/custom/Custom.h

replace_headers = Custom.h::external/sources/custom/Custom.h

classes = Custom

classes_need_extend = Custom

# 需要为哪些类绑定属性,以空格为间隔,即在js层可以像成员变量的一样使用

field = Custom::[dValue nValue]

skip =

remove_prefix =

classes_have_no_parents =

base_classes_to_skip =

abstract_classes =

rename_functions =

rename_classes =

修改genbindings.py

也可以直接复制一个出来,进行修改

在cmd_args中增加

'cocos2dx_custom.ini': ('cocos2dx_custom', 'jsb_cocos2dx_custom_auto'),

执行genbindings.py脚本

此时这边是出了些问题,错误信息如下

Traceback (most recent call last):

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1884, in <module>

    main()

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1856, in main

    'clang_args': (config.get(s, 'extra_arguments', 0, dict(userconfig.items('DEFAULT'))) or "").split(" "),

  File "C:\Python27\lib\ConfigParser.py", line 623, in get

    return self._interpolate(section, option, value, d)

  File "C:\Python27\lib\ConfigParser.py", line 691, in _interpolate

    self._interpolate_some(option, L, rawval, section, vars, 1)

  File "C:\Python27\lib\ConfigParser.py", line 726, in _interpolate_some

    section, map, depth + 1)

  File "C:\Python27\lib\ConfigParser.py", line 723, in _interpolate_some

    option, section, rest, var)

InterpolationMissingOptionError: Bad value substitution:

        section: [cocos2dx_custom]

        option : extra_arguments

        key    : clang_include

        rawval :

-------------------------------------

Generating javascript bindings fails.

-------------------------------------

此时这边是把clang_headers = -I%(clangllvmdir)s/%(clang_include)s

后面的属性值去掉,因为我们并没有clang_include的配置,

修改完成后再次执行脚本,又得到了下面的错误

Errors in parsing headers:

1. <severity = Fatal,

    location = <SourceLocation file 'D:\\Android\\android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/include\\cwchar', line 44, column 10>,

    details = "'wchar.h' file not found">

*** Found errors - can not continue

Traceback (most recent call last):

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1884, in <module>

    main()

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1880, in main

    generator.generate_code()

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1527, in generate_code

    self._parse_headers()

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1571, in _parse_headers

    raise Exception("Fatal error in parsing headers")

Exception: Fatal error in parsing headers

-------------------------------------

Generating javascript bindings fails.

-------------------------------------

此时告诉我们找不到"'wchar.h' file not found"

大概是说找不到头文件,这边对比了下coco2dx.ini

发现跟据这个配置手动跳转到这些目录是能正常找到这个文件,些时我把

android_flags = -target armv7-none-linux-androideabi -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -DANDROID -D__ANDROID_API__=14 -gcc-toolchain %(gcc_toolchain_dir)s --sysroot=%(androidndkdir)s/platforms/android-14/arch-arm -idirafter %(androidndkdir)s/sources/android/support/include -idirafter %(androidndkdir)s/sysroot/usr/include -idirafter %(androidndkdir)s/sysroot/usr/include/arm-linux-androideabi -idirafter %(clangllvmdir)s/lib64/clang/5.0/include -I%(androidndkdir)s/sources/cxx-stl/llvm-libc++/include

再次执行脚本,错误又来了

Traceback (most recent call last):

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1884, in <module>

    main()

  File "D:\CocosCreator\resources\cocos2d-xcopy\tools\bindings-generator/generator.py", line 1856, in main

    'clang_args': (config.get(s, 'extra_arguments', 0, dict(userconfig.items('DEFAULT'))) or "").split(" "),

  File "C:\Python27\lib\ConfigParser.py", line 623, in get

    return self._interpolate(section, option, value, d)

  File "C:\Python27\lib\ConfigParser.py", line 691, in _interpolate

    self._interpolate_some(option, L, rawval, section, vars, 1)

  File "C:\Python27\lib\ConfigParser.py", line 723, in _interpolate_some

    option, section, rest, var)

InterpolationMissingOptionError: Bad value substitution:

        section: [cocos2dx_custom]

        option : extra_arguments

        key    : android_headers

        rawval :  %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s

-------------------------------------

Generating javascript bindings fails.

-------------------------------------

告诉了我们,找不到android_headers这个key,这边照仿cocos2dx.ini写了一个空的

android_headers

再一次执行脚本

成功了,此时,你会在你的cocos2d-xcopy\cocos\scripting\js-bindings\auto目录下看到

jsb_cocos2dx_custom_auto.hpp 跟 jsb_cocos2dx_custom_auto.cpp

我们期待已久的绑定终于出来了,大致的内容如下 

以下是个人的完整配置

[cocos2dx_custom]

prefix = cocos2dx_custom

target_namespace = jsb

android_headers =

android_flags = -target armv7-none-linux-androideabi -D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS -DANDROID -D__ANDROID_API__=14 -gcc-toolchain %(gcc_toolchain_dir)s --sysroot=%(androidndkdir)s/platforms/android-14/arch-arm  -idirafter %(androidndkdir)s/sources/android/support/include -idirafter %(androidndkdir)s/sysroot/usr/include -idirafter %(androidndkdir)s/sysroot/usr/include/arm-linux-androideabi -idirafter %(clangllvmdir)s/lib64/clang/5.0/include -I%(androidndkdir)s/sources/cxx-stl/llvm-libc++/include

clang_headers =

clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__

cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/external/android/include -I%(cocosdir)s/external/sources

cocos_flags = -DANDROID

cxxgenerator_headers =

# extra arguments for clang

extra_arguments = %(android_headers)s %(clang_headers)s %(cxxgenerator_headers)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s

headers = %(cocosdir)s/external/sources/custom/Custom.h

replace_headers = Custom.h::external/sources/custom/Custom.h

classes = Custom

classes_need_extend = Custom

# 需要为哪些类绑定属性,以空格为间隔,即在js层可以像成员变量的一样使用

field = Custom::[dValue nValue]

skip =

remove_prefix =

classes_have_no_parents =

base_classes_to_skip =

abstract_classes =

rename_functions =

rename_classes =

配置生成simulator

到这部离成功就差一点点了

1,打开之前D:\CocosCreator\resources\cocos2d-xcopy\tools\simulator\frameworks\runtime-src\proj.win32\simulator.sln项目

2,找到如下图上所示,增加以面生成出来的两个文件到该处


3,编写注册到js层的代码

找到jsb_module_register.cpp并打开

如下增加注册代码

4,编译导出simulator

编译完成后在

D:\CocosCreator\resources\cocos2d-xcopy\tools\simulator\frameworks\runtime-src\proj.win32\Debug.win32\simulator.exe

找到生成出来的simulator.exe

把这个编译出来的simulator.exe复制到

D:\CocosCreator\resources\cocos2d-xcopy\simulator\win32下替换掉原来的

simulator.exe

编写测试的js代码

1,打开CocosCreator新建一个HelloWorld工程

2,执行 文件设置打开设置界面,并设置新的cocos2d-x引擎为我们的cocos2d-xcopy,如下图

3,增加脚本test.ts,界面增加一按钮,并挂载脚本

4,编写使用jsb绑定上来的custom对象代码

....

onLoad() {

        let custom = new jsb.Custom();

        custom.showString("hello C++");

        custom.showFloat(88.88);

        custom.show();

        custom.setNValue(100);

        custom.show();

        cc.log(custom.getNValue());

        custom.dValue = 99.99;

        custom.show();

        custom.nValue = 886;

        custom.show();

    }

....

5,因为我们只处理了windows模拟器,启动时选用模拟器运行

执行完成后,我们在控制台查看日志如下

到此,我们的C++代码被js调用成功

注意事项

在写自己的C++类时,这个版本的最好是不要继承自cocos2d::Ref,会造成内存没办法释放,存在内存泄漏问题。

在安装工具时,请全使用32位版本的工具,文档中也附上了下载地址,祝你好运

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容