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行就可以。后面的可以不管。

 [testandroid]
name = red_bindings
prefix = red_bindings_auto
classes = RedSprite RedClass
cocosdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/js-bindings/cocos2d-x
customdir = /Users/staff/Documents/Red_Test/jsb_test/frameworks/runtime-src/Classes
headers = %(customdir)s/RedBindings.h
target_namespace = red android_headers = -I%(androidndkdir)s/platforms/android-/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
android_flags = -D_SIZE_T_DEFINED_ clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
clang_flags = -nostdinc -x c++ -std=c++ -U __SSE__ cocos_headers = -I%(cocosdir)s -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)s/cocos/platform/android cocos_flags = -DANDROID 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 remove_prefix =
skip =
base_objects =
abstract_classes =
classes_have_type_info = no
rename =
rename_functions =
rename_classes =
# classes for which there will be no "parent" lookup
classes_have_no_parents = # base classes which will be skipped when their sub-classes found them.
base_classes_to_skip = # 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'.
script_control_cpp = yes

red_bindings.ini

5、修改test.sh,第39行修改CXX_GENERATOR_ROOT,指向 "工程目录/tools/bindings-generator" 就可以。

6、修改最后一行,指定test.ini的路径和生成代码的路径。下面是我的配置:

 #!/bin/bash
#
# Usage:
# export NDK_ROOT=/path/to/NDK-r9b
# ./test.sh # exit this script if any commmand fails
set -e # read user.cfg if it exists and is readable _CFG_FILE=$(dirname "$0")"/user.cfg"
if [ -f "$_CFG_FILE" ];
then
if [ ! -r "$_CFG_FILE" ]; then
echo "Fatal Error: $_CFG_FILE exists but is unreadable"
exit
fi
fi # paths if [ -z "${NDK_ROOT+aaa}" ]; then
# ... if NDK_ROOT is not set, use "$HOME/bin/android-ndk"
NDK_ROOT="$HOME/bin/android-ndk"
fi if [ -z "${PYTHON_BIN+aaa}" ]; then
# ... if PYTHON_BIN is not set, use "/usr/bin/python2.7"
PYTHON_BIN="/usr/bin/python2.7"
fi # find current dir
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # paths with defaults hardcoded to relative paths if [ -z "${CXX_GENERATOR_ROOT+aaa}" ]; then
CXX_GENERATOR_ROOT="/Users/staff/Documents/Red_Test/jsb_test/tools/bindings-generator"
fi echo "Paths"
echo " NDK_ROOT: $NDK_ROOT"
echo " PYTHON_BIN: $PYTHON_BIN"
echo " CXX_GENERATOR_ROOT: $CXX_GENERATOR_ROOT"
echo " TO_JS_ROOT: $TO_JS_ROOT" # check NDK version, must be r9b
# if ! grep -q r9b $NDK_ROOT/RELEASE.TXT
# then
# echo " Fatal Error: NDK r9b must be required!"
# exit
# fi # check clang include path
OS_NAME=$('uname')
NDK_LLVM_ROOT=$NDK_ROOT/toolchains/llvm-3.3/prebuilt
if [ ! -d "$DIRECTORY" ]; then
NDK_LLVM_ROOT=$NDK_ROOT/toolchains/llvm-3.4/prebuilt
fi
case "$OS_NAME" in
Darwin | darwin)
echo "in darwin"
if [ -d "$NDK_LLVM_ROOT/darwin-x86_64" ]; then
NDK_LLVM_ROOT=$NDK_LLVM_ROOT/darwin-x86_64
elif [ -d "$NDK_LLVM_ROOT/darwin-x86" ]; then
NDK_LLVM_ROOT=$NDK_LLVM_ROOT/darwin-x86
else
echo $NDK_LLVM_ROOT
echo " Fatal Error: $NDK_LLVM_ROOT doesn't contains prebuilt llvm 3.3 or 3.4"
exit
fi
;;
Linux | linux)
echo "in linux"
if [ -d "$NDK_LLVM_ROOT/linux-x86_64" ]; then
NDK_LLVM_ROOT=$NDK_LLVM_ROOT/linux-x86_64
elif [ -d "$NDK_LLVM_ROOT/linux-x86" ]; then
NDK_LLVM_ROOT=$NDK_LLVM_ROOT/linux-x86
else
echo " Fatal Error: $NDK_LLVM_ROOT doesn't contains prebuilt llvm 3.3 or 3.4"
exit
fi
;;
*)
echo " Fatal Error: Please run this script in linux or mac osx."
exit
;;
esac # write userconf.ini _CONF_INI_FILE="$PWD/userconf.ini"
if [ -f "$_CONF_INI_FILE" ]
then
rm "$_CONF_INI_FILE"
fi _CONTENTS=""
_CONTENTS+="[DEFAULT]"'\n'
_CONTENTS+="androidndkdir=$NDK_ROOT"'\n'
_CONTENTS+="clangllvmdir=$NDK_LLVM_ROOT"'\n'
_CONTENTS+="cxxgeneratordir=$CXX_GENERATOR_ROOT"'\n'
_CONTENTS+="extra_flags="'\n' echo
echo "generating userconf.ini..."
echo ---
echo -e "$_CONTENTS"
echo -e "$_CONTENTS" > "$_CONF_INI_FILE"
echo --- # Generate bindings for cocos2dx
echo "Generating bindings for cocos2dx..."
set -x 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都可以。

cocos2d-js Mac下的JSB绑定步骤的更多相关文章

  1. mac下安装redis详细步骤

    Linux下安装redis也可以参照下面的步骤哦!!!! 1.到官网上下载redis,我下载的版本是redis-3.2.5.tar 官网地址:http://redis.io/ 2.将下载下来的tar. ...

  2. 新mac 下第一次 安装 mongodb 步骤

    新入手mac,安装mongo步骤记录:不建议使用网上的brew安装方法,因为试了半天没有成功,应该是新版本限制比较多! 从mongodb官网下载mac版本mongo: 1.访问MongoDB官方下载地 ...

  3. mac下安装MySQL完整步骤(图文详情)

    原文摘自:http://www.jb51.net/article/103841.htm 最近使用Mac系统,准备搭建一套本地web服务器环境.因为Mac系统自带PHP和apach,但是没有自带mysq ...

  4. mac下搭建cordova开发环境

    Apache Cordova 原名叫PhoneGap.是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.PhoneGap最初由Nitobi开发,2011年 ...

  5. Mac下安装MySQL及启动等常用命令

    总结了下mac下的mysql安装步骤:   eclipse JavaEE 下载         JDK -9 macosx下载   一.安装及启动服务 1. MySQL Server 下载.(以mys ...

  6. MAC下 Apache服务器配置

    今天做了一个注册登录提交的页面,后续操作需要用到后端的知识 php+Mysql,之前只是有些了解,现在开始具体操作了,首先从配置环境开始.查了好几篇文档与博客,了解了挺多知识. Mac下Apache服 ...

  7. 在mac下搭建Apacheserver

    Apache作为最流行的Webserver端软件之中的一个.它的长处与地位不言而喻.以下介绍下在mac下搭建Apacheserver的步骤: (1)"前往" –>" ...

  8. Mac下nvm管理node.js版本问题

    本篇文章主要是针对已经安装了node.js和nvm管理工具小伙伴遇到的问题. 管理工具有两个,一个是nvm,还有一个是nnvm的好处就是可以管理多个node版本,而且可以切换想要的版本,可以安装一个稳 ...

  9. cocos2d js jsb XMLHttpRequest 中文乱码

    1.首先讲下怎样使用XMLHttpRequest 下面所说的是在cocos2d-x 2.2.2 或者 2.3 版本号中. 首先要明确cocos2d js事实上分两个版本号,一个是html5的版本号,另 ...

随机推荐

  1. GCD多线程

    GCD本质线程自动管理指令包 GCD优点: 1.GCD 本身自带有线程锁的效果,能通过推迟昂贵计算任务并在后台运行它们来改善应用的响应性能. 2.GCD 提供了更易于使用的并发模型(效果方面类似于对锁 ...

  2. linux中shell编程

    shell编程 1 echo -e 识别\转义符 \a \b \t \n \x十六进制 \0八进制 等等 #!/bin/bash echo -e "hello world" 执行脚 ...

  3. C语言内存管理

    作用域: 1.代码块儿作用域: 注意的是:这里面{}就代表一个代码块儿,里面的东西是独立的,不可被其他地方访问的. 2.函数作用域 3.文件作用域 先提一下 在当前有一个文件,main.c 还有一个文 ...

  4. Linux学习之路:认识shell和bash

    一.shell  计算机硬件的直接控制者是操作系统的内核(kernel),因为内核的重要性,所以作为用户的我们是无法直接操作内核的,所以我们需要shell调用应用程序或者双击打开安装的应用软件与内核之 ...

  5. MAC上安装Homebrew、Nginx、PHP、MySQL

    准备工作 新版的 Mac OS 内置了Apache 和 PHP,可以通过以下命令查看Apache和PHP的版本号: # httpd -v # php -v 安装Homebrew Mac下的Homebr ...

  6. javascript中substring和substr方法

    1.substring 方法 定义:用于提取字符串中介于两个指定下标之间的字符 语法:stringObject.substring(start,stop) 参数描述: start 必需.一个非负的整数 ...

  7. vagrant yii2 Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002]

    开发环境:vangrant + LAMP 安装了yii2 advanced版本之后,通过url访问fornted 报数据库user表不存在,看了安装yii2 advanced的教程,里面说需要需要运行 ...

  8. 1.2、Mybatis二级缓存测试

    package me.gacl.test; import me.gacl.domain.User; import me.gacl.util.MyBatisUtil; import org.apache ...

  9. 认识JSON

    JSON 全称 JavaScript Object Notation,意思是JavaScript对象表示法.是一种基于文本的.独立于语言的轻量级数据交换格式.易于阅读和编写,易于机器解析和生成. 一. ...

  10. 再跟SQL谈一谈--高级篇(一)

    1.SELECT KEYWORD ①TOP ②LIKE ③IN ④BETWEEN...AND ⑤ALIAS 2.SELECT JOIN ①JOIN | INNER JOIN ②LEFT JOIN ③R ...