1:本文的基础是建立在官方的文档上的,官方文档https://docs.cocos.com/creator/2.4/manual/zh/advanced-topics/jsb-auto-binding.html,由于官方也是引用论坛里别人的连接,所以文档里有些东西是creator旧版本的,但基本思路是一致的,下面主要围绕不同的做说明

2:需要注意点:

(1)下载的python版本必须是32位的2.7版本,下载地址 https://www.python.org/ftp/python/

(2)window环境只需要配置NDK_ROOT的环境变量,PYTHON_BIN是不需要的

3:creator2.4,自己新建的项目是没有tojs文件夹的,但creator的安装目录是有的,这里可以直接把tojs的上一层目录tools拷到项目路径下

4:例子里的有些文件会导入头文件base/CCConsole.h,需要注释掉,新版本已经没这个文件了,注释掉代码不会受影响

// #include "base/CCConsole.h"

ABCJSBBridge.cpp文件更改一下:

#include "ABCJSBBridge.h"// include platform specific implement class
// #if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)// #include "ABCJSBBridge-apple.h"
// #define JSBBridgeImpl  JSBBridgeApple// #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)// 这里只实现了android的
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "ABCJSBBridge-android.h"
#define JSBBridgeImpl  ABCJSBBridge_android#endifnamespace abc
{// singleton stuffstatic JSBBridge *s_SharedJSBBridge = nullptr;JSBBridge::JSBBridge(){DLLOG("Construct JSBBridge %p", this);init();}JSBBridge::~JSBBridge(){DLLOG("Destruct JSBBridge %p", this);s_SharedJSBBridge = nullptr;}JSBBridge* JSBBridge::getInstance(){if (!s_SharedJSBBridge){DLLOG("getInstance JSBBridge ");s_SharedJSBBridge = new (std::nothrow) JSBBridge();CCASSERT(s_SharedJSBBridge, "FATAL: Not enough memory for create JSBBridge");}return s_SharedJSBBridge;}bool JSBBridge::init(void){DLLOG("init JSBBridge ");_impl.reset(new JSBBridgeImpl());return true; // 原来没加上的}void JSBBridge::abcLog(const int level, const std::string& tag, const std::string& msg){_impl->abcLog(level, tag, msg);}
}

5:genbindings_test.py文件和以前的已经不一样了,对应的修改如下

    try:tojs_root = '%s/tools/tojs' % project_rootoutput_dir = '%s/cocos/scripting/js-bindings/auto' % project_root# cmd_args = {#                'cocos2dx.ini' : ('cocos2d-x', 'jsb_cocos2dx_auto'),#                'cocos2dx_webview.ini': ('webview', 'jsb_webview_auto'),#                'cocos2dx_video.ini': ('video', 'jsb_video_auto'),#                'cocos2dx_audioengine.ini' : ('cocos2dx_audioengine', 'jsb_cocos2dx_audioengine_auto'),#                'cocos2dx_extension.ini' : ('cocos2dx_extension', 'jsb_cocos2dx_extension_auto'),#                'cocos2dx_network.ini' : ('cocos2dx_network', 'jsb_cocos2dx_network_auto'),#                'gfx.ini': ('gfx', 'jsb_gfx_auto'),#                'renderer.ini': ('renderer', 'jsb_renderer_auto'),#                'cocos2dx_spine.ini': ('cocos2dx_spine','jsb_cocos2dx_spine_auto'),#                'cocos2dx_editor_support.ini': ('cocos2dx_editor_support','jsb_cocos2dx_editor_support_auto'),#                'cocos2dx_dragonbones.ini': ('cocos2dx_dragonbones','jsb_cocos2dx_dragonbones_auto'),# 'cocos2dx_particle.ini': ('cocos2dx_particle', 'jsb_cocos2dx_particle_auto')# }target = 'spidermonkey'generator_py = '%s/generator.py' % cxx_generator_root# for key in cmd_args.keys():#     args = cmd_args[key]#     cfg = '%s/%s' % (tojs_root, key)#     print 'Generating bindings for %s...' % (key[:-4])#     command = '%s %s %s -s %s -t %s -o %s -n %s' % (python_bin, generator_py, cfg, args[0], target, output_dir, args[1])#     print(command)#     _run_cmd(command)custom_cmd_args = {'cocos2dx_test.ini': ('cocos2dx_test', 'jsb_cocos2dx_test_auto')}for key in custom_cmd_args.keys():args = custom_cmd_args[key]cfg = '%s/%s' % (tojs_root, key)print 'Generating bindings for %s...' % (key[:-4])command = '%s %s %s -s %s -t %s -o %s -n %s' % (python_bin, generator_py, cfg, args[0], target, output_dir, args[1])print(command)_run_cmd(command)print '----------------------------------------'print 'Generating javascript bindings succeeds.'print '----------------------------------------'

7:对应的cocos2dx_test.ini修改,可以对照其他的ini文件修改

[cocos2dx_test]
prefix = cocos2dx_testtarget_namespace = abcandroid_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 -I%(cocosdir)s/external/android/arm64-v8a/include/v8clang_headers =
clang_flags = -nostdinc -x c++ -std=c++11 -fsigned-char -U__SSE__cocos_headers = -I%(cocosdir)s/cocos -I%(cocosdir)s/cocos/platform/android -I%(cocosdir)s/external/sources  -I%(cocosdir)s/cocos/editor-support
cocos_flags = -DANDROIDcxxgenerator_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)sheaders = %(cocosdir)s/cocos/test/ABCJSBBridge.hreplace_headers = classes = JSBBridgeclasses_need_extend = field = ParticleSimulator::[positionType emissionRate totalParticles duration emitterMode life lifeVar startSize startSizeVar endSize endSizeVar startSpin startSpinVar endSpin endSpinVar angle angleVar speed speedVar radialAccel radialAccelVar tangentialAccel tangentialAccelVar rotationIsDir startRadius startRadiusVar endRadius endRadiusVar rotatePerS rotatePerSVar aspectRatio]skip = JSBBridge::[init]remove_prefix = classes_have_no_parents = JSBBridgebase_classes_to_skip = Clonableabstract_classes = JSBBridgerename_functions = rename_classes = 

8:如果没什么意外的话,运行genbindings_test.py就生成了我们需要的文件了

9: 官方没有给出对应的IABCJSBBridgeImpl的android实现,这里补上

(1):ABCJSBBridge-android.h文件


#ifndef __CC_ABCJSBBRIDGE_ANDROID_H__
#define __CC_ABCJSBBRIDGE_ANDROID_H__#include "platform/CCPlatformConfig.h"
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID#include "test/CCIABCJSBBridgeIml.h"
#include "base/ccMacros.h"
#include "base/ccTypes.h"
#include <string>
#include <vector>
#include "jni.h"//! @brief  Helper class to handle file operations
class CC_DLL ABCJSBBridge_android : public abc::IABCJSBBridgeImpl
{
public:ABCJSBBridge_android();/*** @js NA* @lua NA*/virtual ~ABCJSBBridge_android();void abcLog(const int level, const std::string& tag, const std::string& msg);// void abcLog(const int level, const std::string& tag, ...);
};// end of platform group
/// @}#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID#endif // __CC_ABCJSBBRIDGE_ANDROID_H__

(2):ABCJSBBridge-android.cpp文件

#include "platform/CCPlatformConfig.h"
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID// #include "../platform/CCCommon.h" ??
#include "ABCJSBBridge-android.h"
#include <android/log.h>
#include "../platform/android/jni/JniHelper.h"
#include "../platform/CCFileUtils.h"#define  LOG_TAG    "ABCJSBBridge-android.cpp"
#define  LOGD(level,tag, ...)  __android_log_print(level,tag,__VA_ARGS__)#include "base/ccMacros.h"
#include "base/ccTypes.h"ABCJSBBridge_android::ABCJSBBridge_android()
{
}ABCJSBBridge_android::~ABCJSBBridge_android()
{
}void ABCJSBBridge_android::abcLog(const int level, const std::string& tag, const std::string& msg) {
// void abcLog(const int level, const std::string& tag, ...) {LOGD(level, tag.c_str(), msg.c_str(), NULL);
}#endif // CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID

10:修改jsb_module_register.cpp文件,需要注意的文件指路径是在build\jsb-default\frameworks\runtime-src\Classes下面

11 :jsb_boot.js这个文件2.4已经去掉了,abc.JSBBridge = abc.JSBBridge.getInstance();这句代码是非必要的,现在我们可以在js代码里直接调用了

var level = 2;
var msg = "abc"
abc.JSBBridge.getInstance().abcLog(level, 'test', msg);

cocoscreator2.4 jsb自动绑定相关推荐

  1. JSBing-js自动绑定C++

    什么是JSB JSB是JavaScript binding的简称.Cocos2d-JS中使用的javascript引擎是Mozilla 的spidermonkey,而JSB绑定的目的就是让javasc ...

  2. Gin 框架学习笔记(02)— 参数自动绑定到结构体

    参数绑定模型可以将请求体自动绑定到结构体中,目前支持绑定的请求类型有 JSON .XML .YAML 和标准表单 form数据 foo=bar&boo=baz 等.换句话说,只要定义好结构体, ...

  3. 使用Ext Form自动绑定Html中的Form元素

    2019独角兽企业重金招聘Python工程师标准>>> Java代码   //把ext 对象绑定在Html Form元素时的ext属性中 Ext.override(Ext.Compo ...

  4. japid-controller自动绑定的数据类型

    参考文献:http://www.playframework.org/documentation/1.2.3/controllers 当参数名和HTTP请求中的参数名(即界面中的name)相同时,后台C ...

  5. spinbox 上下箭头事件_[React] 3 - 自动绑定 (事件绑定)

    1. 自动绑定 (事件绑定) 绑定this: React为什么要这么做? 是js中this绑定方式决定的,和react工作方式无关. 函数处理, 是作为回调传递的,这样就会丢失了上下文, 所以this ...

  6. mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定

    mvvm 自动绑定 这是我们从头开始构建ZK应用程序的第二集. 上一篇文章介绍了使用MVVM将数据加载和呈现到表中. 在本文中,我们将向您介绍ZK MVVM的表单绑定. 目的 我们将构建一个" ...

  7. react回调函数_React中的回调中自动绑定ES6类函数

    在使用ES6类的React组件时,您必须遇到这种现象,必须显式绑定类函数,然后将其传递给诸如onClick.例如,采用以下示例. import React from 'react';class MyC ...

  8. java resultset 赋值_ResultSet数据自动绑定到JavaBean中 | 学步园

    由于需要用jdbc写点程序,不使用Hibernate , mybatis等框架,在设置结果集到bean时相当麻烦,所以写了一个专门完成此功能的类 package com.ehl.dc.authoriz ...

  9. 一个完全摆脱findViewById的自动绑定库

    代码地址如下: http://www.demodashi.com/demo/13504.html 问题 先来看一个正常的写法: <?xml version="1.0" enc ...

最新文章

  1. Lombok 天天用,却不知道它的原理是什么?
  2. 【yii2】 yii框架如果控制器和方法都是多个单词组成应该怎样写请求链接
  3. 20165305 苏振龙 《Java 程序设计》第一次测试总结
  4. 按压缩格式整理打包(解包)和压缩(解压)命令
  5. sql 除法_七天学会SQL-04SQL复杂查询
  6. 《梦断代码》阅读笔记之第8章至最后
  7. 烂泥:perl中CPAN的安装
  8. Spark数据本地性
  9. 《Android 应用案例开发大全(第二版)》——2.3节案例的基本框架
  10. java版的贪吃蛇。
  11. PHP字符串作为字节数组,哈希hash然后base64编码
  12. Labview自适应屏幕分辨率
  13. 宏基笔记本升级bios(2012-12-28-bd 写的日志迁移
  14. Tuxedo中间件开发和管理
  15. 【Python】日期处理-中国法定节假日
  16. 重庆邮电大学计算机学院蓝桥杯,第七届蓝桥杯大赛个人赛(软件类)-重庆赛区获奖名单...
  17. 关于Cocos2d-x节点和精灵节点的坐标、位置以及大小的设置
  18. Vulkan学习(十五): 总结
  19. 【java基础】int和tinyint的区别
  20. 全国医师资格考试计算机化模拟考试系统考生操作流程

热门文章

  1. Linux权限控制的基本原理
  2. FPGA零基础学习:IP CORE 之 PLL设计
  3. Python视频制作 MoviePy框架图文处理模块
  4. 操作系统:进程与线程大解析
  5. 计算机专业考研英语二国家线,近五年不同专业考研英语国家线分析:变化范围1~8分...
  6. Python爬虫实例-爬取豆瓣电影Top250
  7. 5 个简单易用心理技巧 | 看完治好了我的颓废
  8. *CTF2022 oh-my-notepro
  9. 我们都希望在最好的年华遇见一个人,可往往是遇见一个人才迎来最最好的年华
  10. 音频转文字怎么操作?推荐三个实用软件