cocos2d-js由于采用js语言,使得做一些native的功能比较受限,例如文件和目录操作、socket操作等。逼不得已,这时我们就不得不做jsbinding了。。
官方提供的jsbinding方法还是很人性化的,但是网上根本没有找到合适的资料,我就自己先写一篇吧。
用cocos new命令创建工程之后,在 "工程目录/tools/bindings-generator" 目录下有一个generator.py脚本,test目录下有官方示例,这些都是我们需要的。
步骤开始:
1、安装python2.7。然后安装PyYAML和Cheetah,不同平台安装方法可能有区别,Mac下直接到PyYAML和Cheetah的解压目录下执行sudo ./setup.py就可以。
2、把 "工程目录/tools/bindings-generator/test" 下面的test.ini、test.sh、userconf.ini.sample这三个文件拷贝一份到自己能找到的地方,并把userconf.ini.sample重命名为userconf.ini。
3、修改userconf.ini,指定androidndkdir、clangllvmdir、cxxgeneratordir的路径。
4、修改test.ini,需要修改的有:引用的头文件的路径、绑定的类名、命名空间。下面是我的配置,使用我的配置,只需要修改前7行就可以。后面的可以不管。
1 [testandroid]
2 name = red_bindings
3 prefix = red_bindings_auto
4 classes = RedSprite RedClass
5 cocosdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/js-bindings/cocos2d-x
6 customdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/runtime-src/Classes
7 headers = %(customdir)s/RedBindings.h
8 target_namespace = red
9
10 android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/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
11 android_flags = -D_SIZE_T_DEFINED_
12
13 clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
14 clang_flags = -nostdinc -x c++ -std=c++11 -U __SSE__
15
16 cocos_headers = -I%(cocosdir)s -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android
17
18 cocos_flags = -DANDROID
19
20 extra_arguments = %(android_headers)s %(clang_headers)s %(customdir)s %(cocos_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)s
21
22 remove_prefix =
23 skip =
24 base_objects =
25 abstract_classes =
26 classes_have_type_info = no
27 rename =
28 rename_functions =
29 rename_classes =
30 # classes for which there will be no "parent" lookup
31 classes_have_no_parents =
32
33 # base classes which will be skipped when their sub-classes found them.
34 base_classes_to_skip =
35
36 # Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
37 script_control_cpp = yes
red_bindings.ini
5、修改test.sh,第39行修改CXX_GENERATOR_ROOT,指向 "工程目录/tools/bindings-generator" 就可以。
6、修改最后一行,指定test.ini的路径和生成代码的路径。下面是我的配置:
1 #!/bin/bash
2 #
3 # Usage:
4 # export NDK_ROOT=/path/to/NDK-r9b
5 # ./test.sh
6
7 # exit this script if any commmand fails
8 set -e
9
10 # read user.cfg if it exists and is readable
11
12 _CFG_FILE=$(dirname "$0")"/user.cfg"
13 if [ -f "$_CFG_FILE" ];
14 then
15 if [ ! -r "$_CFG_FILE" ]; then
16 echo "Fatal Error: $_CFG_FILE exists but is unreadable"
17 exit 1
18 fi
19 fi
20
21 # paths
22
23 if [ -z "${NDK_ROOT+aaa}" ]; then
24 # ... if NDK_ROOT is not set, use "$HOME/bin/android-ndk"
25 NDK_ROOT="$HOME/bin/android-ndk"
26 fi
27
28 if [ -z "${PYTHON_BIN+aaa}" ]; then
29 # ... if PYTHON_BIN is not set, use "/usr/bin/python2.7"
30 PYTHON_BIN="/usr/bin/python2.7"
31 fi
32
33 # find current dir
34 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
35
36 # paths with defaults hardcoded to relative paths
37
38 if [ -z "${CXX_GENERATOR_ROOT+aaa}" ]; then
39 CXX_GENERATOR_ROOT="/Users/staff/Documents/Red_Test/jsb_test/tools/bindings-generator"
40 fi
41
42
43 echo "Paths"
44 echo " NDK_ROOT: $NDK_ROOT"
45 echo " PYTHON_BIN: $PYTHON_BIN"
46 echo " CXX_GENERATOR_ROOT: $CXX_GENERATOR_ROOT"
47 echo " TO_JS_ROOT: $TO_JS_ROOT"
48
49 # check NDK version, must be r9b
50 # if ! grep -q r9b $NDK_ROOT/RELEASE.TXT
51 # then
52 # echo " Fatal Error: NDK r9b must be required!"
53 # exit 1
54 # fi
55
56 # check clang include path
57 OS_NAME=$('uname')
58 NDK_LLVM_ROOT=$NDK_ROOT/toolchains/llvm-3.3/prebuilt
59 if [ ! -d "$DIRECTORY" ]; then
60 NDK_LLVM_ROOT=$NDK_ROOT/toolchains/llvm-3.4/prebuilt
61 fi
62 case "$OS_NAME" in
63 Darwin | darwin)
64 echo "in darwin"
65 if [ -d "$NDK_LLVM_ROOT/darwin-x86_64" ]; then
66 NDK_LLVM_ROOT=$NDK_LLVM_ROOT/darwin-x86_64
67 elif [ -d "$NDK_LLVM_ROOT/darwin-x86" ]; then
68 NDK_LLVM_ROOT=$NDK_LLVM_ROOT/darwin-x86
69 else
70 echo $NDK_LLVM_ROOT
71 echo " Fatal Error: $NDK_LLVM_ROOT doesn't contains prebuilt llvm 3.3 or 3.4"
72 exit 1
73 fi
74 ;;
75 Linux | linux)
76 echo "in linux"
77 if [ -d "$NDK_LLVM_ROOT/linux-x86_64" ]; then
78 NDK_LLVM_ROOT=$NDK_LLVM_ROOT/linux-x86_64
79 elif [ -d "$NDK_LLVM_ROOT/linux-x86" ]; then
80 NDK_LLVM_ROOT=$NDK_LLVM_ROOT/linux-x86
81 else
82 echo " Fatal Error: $NDK_LLVM_ROOT doesn't contains prebuilt llvm 3.3 or 3.4"
83 exit 1
84 fi
85 ;;
86 *)
87 echo " Fatal Error: Please run this script in linux or mac osx."
88 exit 1
89 ;;
90 esac
91
92
93 # write userconf.ini
94
95 _CONF_INI_FILE="$PWD/userconf.ini"
96 if [ -f "$_CONF_INI_FILE" ]
97 then
98 rm "$_CONF_INI_FILE"
99 fi
100
101 _CONTENTS=""
102 _CONTENTS+="[DEFAULT]"'n'
103 _CONTENTS+="androidndkdir=$NDK_ROOT"'n'
104 _CONTENTS+="clangllvmdir=$NDK_LLVM_ROOT"'n'
105 _CONTENTS+="cxxgeneratordir=$CXX_GENERATOR_ROOT"'n'
106 _CONTENTS+="extra_flags="'n'
107
108 echo
109 echo "generating userconf.ini..."
110 echo ---
111 echo -e "$_CONTENTS"
112 echo -e "$_CONTENTS" > "$_CONF_INI_FILE"
113 echo ---
114
115 # Generate bindings for cocos2dx
116 echo "Generating bindings for cocos2dx..."
117 set -x
118
119 LD_LIBRARY_PATH=${CXX_GENERATOR_ROOT}/libclang $PYTHON_BIN ${CXX_GENERATOR_ROOT}/generator.py /Users/staff/Documents/Red_Test/jsb_test/frameworks/bindingconf/red_bindings.ini -t spidermonkey -s testandroid -o ./simple_test_bindings
red_bindings.sh
7、执行刚才的sh文件应该就会在指定的目录生成绑定代码了。把生成的cpp和hpp文件复制到 "工程目录/frameworks/runtime-src/Classes" 中,修改AppDelegate.cpp,include刚生成的hpp,在applicationDidFinishLaunching函数中添加"sc->addRegisterCallback(register_all_red_bindings_auto);"(参数是注册绑定的函数指针,一般都是已"register_all"开头)。
8、编译runtime就可以了,实测在Mac、android、ios都可以。
原文链接: https://www.cnblogs.com/wolfred7464/p/4554512.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/217222
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!