什么是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
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. location = 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 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 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 = 到这部离成功就差一点点了 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 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位版本的工具,文档中也附上了下载地址,祝你好运配置生成simulator
编写测试的js代码
注意事项