cocoscreator2.4 jsb自动绑定

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

#endif

namespace abc
{
    // singleton stuff
    static 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_root
        output_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_test

target_namespace = abc

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 -I%(cocosdir)s/external/android/arm64-v8a/include/v8

clang_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 = -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/cocos/test/ABCJSBBridge.h

replace_headers = 

classes = JSBBridge

classes_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 = JSBBridge

base_classes_to_skip = Clonable

abstract_classes = JSBBridge

rename_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);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值