栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 游戏开发 > 其他

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 
#include 
#include "jni.h"

//! @brief  Helper class to handle file operations
class CC_DLL ABCJSBBridge_android : public abc::IABCJSBBridgeImpl
{
public:
    ABCJSBBridge_android();
    
    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 
#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文件,需要注意的文件指路径是在buildjsb-defaultframeworksruntime-srcClasses下面

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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1065651.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号