js -- 捆绑

1.环境配置

主要參考网址:

http://cocos2d.cocoachina.com/bbs/forum.php?mod=viewthread&tid=10226&extra=page%3D1&page=2

http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_bind_C++_to_Javascript

一些环境的搭建參考

软件安装与卸载:http://blog.csdn.net/renzhe20092584/article/details/10287899

configuration 里的配置文件夹

/Users/admin/Documents/work/mac/cocos2d-x-2.1.5/tools/bindings-generator/test

userconf.ini

androidndkdir=/Users/admin/Documents/work/android/android-ndk-r8e

clangllvmdir=/Users/admin/Documents/work/mac/clang+llvm-3.3-x86_64-apple-darwin12

cxxgeneratordir=/Users/admin/Documents/work/mac/cocos2d-x-2.1.5/tools/bindings-generator

user.cfg

PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python

2.手动绑定

參考:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/How_to_bind_C++_to_Javascript

error:

JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);
JS_DefineFunction(cx, jsb_prototype, "release", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);

3.AppDelegate

1.applicationDidFinishLaunching

ScriptingCore* sc = ScriptingCore::getInstance();

sc->addRegisterCallback(register_all);

sc->start();

開始的时候就会调用JSB_AUTO的 register_all 方法,注冊一些事件。

CCScriptEngineProtocol *pEngine =ScriptingCore::getInstance();

CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);

ScriptingCore::getInstance()->runScript("hello.js");
        执行此脚本

2.handle_signal

void handle_signal(int signal)   此方法一直没有运行过

4.JSB_AUTO

都是全局方法没有类方法

1.  .h文件

void register_all(JSContext* cx,JSObject* obj);  
仅仅有这一个方法的声明,由于  AppDelegate 里引用的是 JSB_AUTO.h 文件,用到方法register_all

2.js_constructor(JSContext* cx,uint32_t argc, jsval*
vp)

结构体方法。通过 new 在 js 里创建 c++ 对象时候调用。

3.JSBooljs_create(JSContext* cx,uint32_t argc, jsval*
vp)

通过 create 在 js 里创建 c++ 对象时候调用。

4.JSBoolJSB_cocos2dx_retain(JSContext* cx,uint32_t argc, jsval *vp)

在 js 里对 创建的 2dx c++ 对象运行了 .retain 方法时调用

5.JSBoolJSB_cocos2dx_release(JSContext* cx,uint32_t argc, jsval *vp)

在 js 里对 创建的 2dx c++ 对象运行了 .release 方法时调用

6.voidregister_all(JSContext* cx,JSObject*
obj)

在 AppDelegate 里注冊的此方法,还没有执行 js 脚本得时候。就被调用了。

JS_GetProperty(cx, obj,"JS", &nsval);  固定写法?

JS_SetProperty(cx, obj,"JSB", &nsval);  TT 是 c++命名空间

注冊 2dx 的内存管理

JS_DefineFunction(cx, jsb_prototype,"retain",JSB_cocos2dx_retain,0,JSPROP_READONLY |JSPROP_PERMANENT);

JS_DefineFunction(cx, jsb_prototype,"release",JSB_cocos2dx_release,0,JSPROP_READONLY |JSPROP_PERMANENT);

7.void js_register(JSContext* cx,JSObject*
global)

通过 6 方法,调用此方法

jsb_class->name = "JSBinding";   注冊类名

staticJSFunctionSpec funcs[] =

    {

        JS_FN("functionTest",js_functionTest,1,JSPROP_PERMANENT | JSPROP_ENUMERATE),
  绑定 js 要调用 c++ 的方法 functionTest通过全局方法js_functionTest 去调用 

        JS_FS_END

    };

JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, &found);

TypeTest<JSB::JSBinding> t;

8.JSBool js_functionTest(JSContext* cx,uint32_t argc,jsval*
vp)

在 7 中注冊了此方法,通过 js 某个事件触发调用。

JSB::JSBinding* cobj = NULL;

cobj = (JSB::JSBinding* )(proxy ? proxy->ptr : NULL);

cobj->functionTest();   调用自己创建的那个类的functionTest 方法 

5.JSBinding

此类是自己写得类。这里能够实现自己想要的方法。

1 .h文件

namespace JSB    命名空间

{

    class JSBinding:publiccocos2d::CCObject

    {

    public:

        staticcocos2d::CCScene* scene();

        virtualbool init();

        CREATE_FUNC(JSBinding);

        void functionTest();

    };

}

2.bool JSB::JSBinding::init()

通过 create 在 js 中创建对象的时候调用,建议不要使用 create 创建对象,会出现故障。使用 new 之后再调用 create() 方法。

3.void JSB::JSBinding::functionTest()  用 js 调用的方法 

v是回调 js 的參数。

ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj),"callback",2,
v, &retval);

6.监听home键的绑定

.cpp

void AppDelegate::applicationDidEnterBackground()

{

    Director::getInstance()->stopAnimation();

    SimpleAudioEngine::getInstance()->pauseBackgroundMusic();

    SimpleAudioEngine::getInstance()->pauseAllEffects();

    

    ScriptingCore* sc =ScriptingCore::getInstance();

    jsval nsval;

    JS_GetProperty(sc->getGlobalContext(), sc->getGlobalObject(),"plugin",
&nsval);

    if (nsval !=JSVAL_VOID) {

        sc->executeFunctionWithOwner(nsval,"onApplicationDidEnterBackground");

    }

}

void AppDelegate::applicationWillEnterForeground()

{

    Director::getInstance()->startAnimation();

    SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

    SimpleAudioEngine::getInstance()->resumeAllEffects();

    

    ScriptingCore* sc =ScriptingCore::getInstance();

    jsval nsval;

    JS_GetProperty(sc->getGlobalContext(), sc->getGlobalObject(),"plugin",
&nsval);

    if (nsval !=JSVAL_VOID) {

        sc->executeFunctionWithOwner(nsval,"onApplicationWillEnterForeground");

    }

}

.js调用

plugin 相当于全局变量

if(plugin){

plugin.onApplicationDidEnterBackground = function() {

cc.log(" plugin.onApplicationDidEnterBackground11.");

};

plugin.onApplicationWillEnterForeground = function() {

cc.log("plugin.onApplicationWillEnterForegro11und.");

};

}

研究

1.眼下能执行的脚本仅仅有 hello.js 自己创建的脚本不能被执行。

2. js --> c++ 和 c++ --> js  时候參数的传递

3. 用 js 写的界面和 c++ 的界面来回切换

7.cocos2dx源代码实现 JSB

在cocos2dx源代码里加入自己的实现方法。cocos2d-html5仅仅是方便开发。

以 cc.FileUtils.getInstance() 加入自己的方法为样例

1.js_cocos2dx_auto.hpp

  JSBool js_cocos2dx_CCFileUtils_woTest(JSContext *cx, uint32_t argc, jsval *vp);
測试方法

2.js_cocos2dx_auto.cpp

   void js_register_cocos2dx_CCFileUtils(JSContext *cx,JSObject *global) { 找到这种方法

         JS_FN("woTest",js_cocos2dx_CCFileUtils_woTest,1,JSPROP_PERMANENT |JSPROP_ENUMERATE),//加入

   }

新创建的方法

JSBool js_cocos2dx_CCFileUtils_woTest(JSContext *cx,uint32_t argc, jsval *vp)

{

JSObject *obj =JS_THIS_OBJECT(cx, vp);

js_proxy_t *proxy =jsb_get_js_proxy(obj);

cocos2d::CCFileUtils* cobj = (cocos2d::CCFileUtils *)(proxy
? proxy->
ptr :NULL);

JSB_PRECONDITION2( cobj, cx,JS_FALSE,"Invalid Native Object");

if (argc ==0) {

std::string ret = cobj->woTest();

jsval jsret;

jsret = std_string_to_jsval(cx, ret);

JS_SET_RVAL(cx, vp, jsret);

returnJS_TRUE;

}

    

JS_ReportError(cx,"wrong number of arguments: %d, was expecting %d", argc,0);

returnJS_FALSE;

}

3.CCFileUtils.h

   virtual std::stringwoTest() =0;

4.不同平台

ios平台

CCFileUtilsIOS.h

virtual std::stringwoTest();

CCFileUtilsIOS.mm

std::stringCCFileUtilsIOS::woTest()

{

    std::string availMemo ="";

    return availMemo;

}

Android

CCFileUtilsAndroid.cpp

std::string CCFileUtilsAndroid::woTest(){

JniMethodInfo methodInfo;

jstring jstr;

if (!JniHelper::getStaticMethodInfo(methodInfo,

"org/cocos2dx/lib/Cocos2dxActivity", "woTest",

"()Ljava/lang/String;")) {

CCLOG("%s %d: error to get methodInfo", __FILE__, __LINE__);

}else{

jstr =  static_cast<jstring>(methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID));

methodInfo.env->DeleteLocalRef(methodInfo.classID);

}

return JniHelper::jstring2string(jstr);

}

CCFileUtilsAndroid.h

virtual std::string woTest();

Cocos2dxActivity.java

public static String woTest(){

return Long.toString(123);

}

5.调用

cc.FileUtils.getInstance().woTest();

其他 jsb 绑定可参考 cocos2dx源代码

时间: 2024-10-18 11:45:30

js -- 捆绑的相关文章

让指定JS出现智能提示

这个问题,困扰了我很久. 大家之道,在Asp.net MVC4中,引入了CSS,JS捆绑优化这个好东东.但是,你会发现,运用了这个捆绑优化后,或者引用了模板后,在模板中引用了JS的文件后,在页面中编辑JS文件后,却不能利索地出现智能感知了.那些一点就出现帮助说明的方法完全失去了功效. 查了一些资料后,终于找到了答案. 1.查看智能感知的设置 其实html的dom对象也没有任何引用,为什么智能感知里就会有呢?原因就在这里: 这里是js智能感知的公共引用文件,这里引用的js会默认被所有用到js的地方

JavaScript图表库的新选择!LightningChart JS入门须知了解一下

对于LightningChart JS,可能很多用户并不是很了解这个产品,这是由Arction Ltd公司最新推出的JavaScript图表库工具.LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源. GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用,从而实现高刷新率和流畅的动画.非常适合用于贸易,工程,航空航天,医药和其他领域的应用. 入门视频 LightningChart JS入门视频(一):使用JavaScr

10 个最适合 Web 和 APP 开发的 NodeJS 框架

在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来说,Node.js 是 JavaScript 运行时,允许你在浏览器之外服务器上运行 JavaScript 代码.它是基于谷歌 Chrome 的 V8 虚拟机引擎建立的,V8 虚拟机引擎用于在 Chrome 浏览器中支持 JavaScript. NodeJS 逐渐普及的步伐是因为它可以让你只使用 J

AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器

AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的文字和其他因地区而异的数据从应用中抽离出来. 本地化意味着为这些抽离的数据和文字提供翻译和转变成本地的格式. 目前,AngularJS支持日期,数字和货币的国际化和本地化. 另外,AngularJS还通过ngPluralize指令支持本地多元化. 所有的AngularJS本地化组件都依赖于$loca

Bundling and Minification(转)

原文地址:https://go.microsoft.com/fwlink/?LinkId=301862 Bundling and minification are two techniques you can use in ASP.NET 4.5 to improve request load time. Bundling and minification improves load time by reducing the number of requests to the server an

MongoDB学习记录一

本博客说明:最开始部分是一个运维部署案例模板,给开发安装MongoDB都可以按照这个模板来进行基本部署,中间部分是自己研究其他博客记录部署和授权相关内容,最后部分是网上视频学习相关内容:www.mongodb.org 下载地址案例安装一个完整MongoDB所做操作:1.上传解压tar -zxvf mongodb-linux-x86_64-3.0.6.tgz -C /home/cd /home && mv mongodb-linux-x86_64-3.0.6 mongodb2.创建所需目录c

MongoDB 数据库的学习与使用

MongoDB 数据库 一.MongoDB 简介(了解) ? MongoDB 数据库是一种 NOSQL 数据库,NOSQL 数据库不是这几年才有的,从数据库的初期发展就以及存在了 NOSQL 数据库.数据库之中支持的 SQL 语句是由 IBM 开发出来的,并且最早就应用在了 Oracle 数据库,但是 SQL 语句的使用并不麻烦,就是几个简单的单词:SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY,但是在这个时候有人开始反感于编写 SQL 操作.于是有一些人就

Asp.net MVC在View里动态捆绑压缩引用的js

前言 Asp.net MVC 4以上版本多了BundleConfig.RegisterBundles方法,可以把要捆绑的脚本或样式进行捆绑压缩,以减少客户端的请求次数从而提高了客户端的访问速度. 问题 但世上懒人的数量还是很多,我也是一个,觉得这个方法还不够方便.在实际中,一些小的页面或独立页面,开了一些开源的js库之后,js文件比较多,而且每个页面引用的js又不太一样,如果能不在BundleConfig描述如何捆绑,像传统一样把js拉过来就能自动达到捆绑后的效果,是懒人多想要的结果.正是朝着这

MVC框架 - 捆绑

捆绑和缩小是两个性能改进提高应用程序在请求负载时的技术.目前大多数的主流浏览器限制每个主机同时连接到六个数量.这意味着,在一个时间,所有的其他请求将被浏览器排队. 启用捆绑和缩小 为使捆绑和缩小MVC应用程序,打开Web.config文件的配置解决. 在该文件中搜索System.Web编译设置: <system.web> <compilation debug="true" /> </system.web> 默认情况下,调试参数设置为true,这意味着