cocos2d-js Mac下的JSB绑定步骤

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都可以。

 

posted @ 2015-06-05 14:12  Anti-Magic  阅读(830)  评论(0编辑  收藏  举报