1. 哪能找到joomla的插件
sjsb的官網下載:
http://code.google.com/p/sjsb/
joomlagate有漢化,如果你是付費會員的話
http://www.joomlagate.com/component/option,com_remository/Itemid,48/func,fileinfo/id,1022/
2. 如何將c++綁定至javascript
下載綁定生成器,本機路徑/Users/iven/Dev/bindings-generator
為了在Mac OS X中安裝運行MacPort埠,系統必須要已經安裝蘋果的「Command Line Developer Tools」(命令行開發者工具)。Xcode 4及以後版本的用戶首先需要通過啟動或運行Xcode接受Xcode EULA。
xcodebuild -license
下載安裝MacPort
注意:如果是Homebrew用戶,應該先卸載Homebrew。因為Homebrew不兼容MacPort。
同時執行MacPort的「selfupdate」命令以確保安裝最新的發布版本。
sudo port -v selfupdate
當更新完成之後,使用MacPort在命令行中安裝python依賴(dependencies)
sudo port install python27 py27-yaml py27-cheetah
你會看到如下所示:
下載llvm-3.3,解壓至$HOME/bin目錄。如果沒有bin目錄,請創建一個bin目錄,將未解壓的ZIP壓縮包重命名為「clang+llvm-3.3」。
最後目錄如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本機的主目錄名字)
樣本代碼
綁定生成器資源庫中包括一個樣本測試用例。打開bindings-generator/test/simple_test文件夾。
配置
根據自己的環境個性化設置「test/userconf.ini」和「test/user.cfg」文件。
注意:應該移除後綴為「.sample」的文件如「user.cfg.sample」和「userconf.ini.sample」
[DEFAULT]
androidndkdir=/Users/iven/Dev/android-ndk-r8c
clangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11
cxxgeneratordir=/Users/iven/Dev/bindings-generator-master
user.cfg配置如下所示
PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7
運行測試樣本
./test.sh
如果環境設置正確,你會看到如下所示:
Errors in parsing headers:
1. <severity = Warning,
location =<SourceLocation file None, line 0, column 0>,
details = "argument unusedring compilation: '-nostdinc++'">
不用擔心這個警告,你已完成運行,測試用例會創建一個包含3個文件的「simple_test_bindings」目錄。
一個綁定類的.hpp頭文件
一個實現綁定類的.cpp文件
一個介紹如何(從Java腳本)調用C++類暴露方法的.js文件。
運行測試
Create a JS base Cocos2d-x project. 創建基於JS的Cocos2d-x項目
將「simple_Test folder」文件夾和「simple_test_binding」文件夾添加到項目中
修改「autogentestbindings.cpp」中的注冊函數如下:
void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {
jsval nsval;
JSObject *ns;
JS_GetProperty(cx, obj, "ts",&nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "ts",&nsval);
} else {
JS_ValueToObject(cx,nsval, &ns);
}
obj = ns;
js_register_autogentestbindings_SimpleNativeClass(cx, obj);
}
注意:如果你將「ts」添加到「test.ini」文件中的「target_namespace」變數里,便會自動生成代碼。無需修改。
target_namespace =ts
在「AppDelegate」中注冊
包含頭文件「autogentestbindings.hpp」然後注冊回調函數:
sc->addRegisterCallback(register_all_autogentestbindings);
在「hello.js」文件適當地方增加以下代碼。本機將「init f」函數放在第一個場景。
var myClass=new ts.SimpleNativeClass();
var myStr=myClass.returnsACString();
var label = cc.LabelTTF.create(myStr, "Helvetica", 20.0);
限制
綁定生成器存在以下兩個限制
自變數數字參數無法工作,所以需要手動編寫包裝器
代表類無法工作,所以需要手動綁定,詳見下一部分。
手動 JSB 綁定
本指南將介紹利用Cocos2d-x 2.14模板如何在自己的項目中實現JSB綁定。
首先用Cocos2d-js模板創建項目。其次,我們會介紹如何一步一步從JS調用本地函數。最後你便會學會如何從本地代碼調用JS代碼了。
現在讓我們開始!本機使用的Mac OS X作為開發環境。
步驟1. 用Cocos2dx-js模板創建新項目,同時新建一個即將綁定至JS的C++類。
將項目命名為「JSBinding」然後點擊「Next」、「 Create」
新建一個類然後實現這個類,等會再將其綁定至JS。
按「command+N」新建一個C++類並命名為「JSBinding」,路徑為「OS X\C and C++\C++ Class」。
將以下代碼添加到「JSBinding.h」文件中。
#include "cocos2d.h"
#include "ScriptingCore.h"
// Define a namespace to manage your code and make your code clearly
namespace JSB {
class JSBinding: public cocos2d::CCObject
{
public:
static cocos2d::CCScene* scene();
virtual bool init();
CREATE_FUNC(JSBinding);
void functionTest();
};
}
現在實現JSBinding.cpp中的類。如下所示:
bool JSB::JSBinding::init(){
bool bRef = false;
do{
cocos2d::CCLog("JSB init...");
bRef = true;
} while (0);
return bRef;
}
void JSB::JSBinding::functionTest(){
cocos2d::CCLog("Function test...");
}
步驟2. 將C++代碼綁定至Java腳本代碼
按「command+N」新建C++類,然後命名「JSB_AUTO」路徑「OS X\C and C++\C++ Class」。
往「JSB_AUTO.h」文件中增加一些代碼
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include "cocos2d.h"
#include "cocos2d_specifics.hpp"
// Binding specific object by defining JSClass
JSClass* jsb_class;
JSObject* jsb_prototype;
// This function is mapping the function 「functionTest」 in 「JSBinding.cpp」
JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){
JSBool ok = JS_TRUE;
JSObject* obj = NULL;
JSB::JSBinding* cobj = NULL;
obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t* proxy = jsb_get_js_proxy(obj);
cobj = (JSB::JSBinding* )(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2(cobj, cx, JS_FALSE, "Invalid Native Object");
if (argc == 0) {
cobj->functionTest();
JS_SET_RVAL(cx, vp, JSVAL_VOID);
return ok;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("JS Constructor...");
if (argc == 0) {
JSB::JSBinding* cobj = new JSB::JSBinding();
cocos2d::CCObject* ccobj = dynamic_cast<cocos2d::CCObject*>(cobj);
if (ccobj) {
ccobj->autorelease();
}
TypeTest<JSB::JSBinding> t;
js_type_class_t* typeClass;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, typeClass);
assert(typeClass);
JSObject* obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
js_proxy_t* p = jsb_new_proxy(cobj, obj);
JS_AddNamedObjectRoot(cx, &p->obj, "JSB::JSBinding");
return JS_TRUE;
}
JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);
return JS_FALSE;
}
// This function is mapping the function 「create」 when using JavaScript code
JSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("js is creating...");
if (argc == 0) {
JSB::JSBinding* ret = JSB::JSBinding::create();
jsval jsret;
do{
if (ret) {
js_proxy_t* proxy = js_get_or_create_proxy<JSB::JSBinding>(cx, ret);
jsret = OBJECT_TO_JSVAL(proxy->obj);
}
else{
jsret = JSVAL_NULL;
}
} while(0);
JS_SET_RVAL(cx, vp, jsret);
return JS_FALSE;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
void js_finalize(JSFreeOp* fop, JSObject* obj){
CCLOGINFO("JSBindings: finallizing JS object %p JSB", obj);
}
// Binding JSB type
void js_register(JSContext* cx, JSObject* global){
jsb_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_class->name = "JSBinding";
jsb_class->addProperty = JS_PropertyStub;
jsb_class->delProperty = JS_PropertyStub;
jsb_class->getProperty = JS_PropertyStub;
jsb_class->setProperty = JS_StrictPropertyStub;
jsb_class->enumerate = JS_EnumerateStub;
jsb_class->resolve = JS_ResolveStub;
jsb_class->convert = JS_ConvertStub;
jsb_class->finalize = js_finalize;
jsb_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
// Binding functionTest function
static JSFunctionSpec funcs[] = {
JS_FN("functionTest", js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding create() function
static JSFunctionSpec st_funcs[] = {
JS_FN("create", js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding constructor function and prototype
jsb_prototype = JS_InitClass(
cx, global,
NULL,
jsb_class,
js_constructor, 0,
properties,
funcs,
NULL,
st_funcs);
JSBool found;
JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, &found);
TypeTest<JSB::JSBinding> t;
js_type_class_t* p;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, p);
if (!p) {
p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));
p->type = typeId;
p->jsclass = jsb_class;
p->proto = jsb_prototype;
p->parentProto = NULL;
HASH_ADD_INT(_js_global_type_ht, type, p);
}
}
// Binding JSB namespace so in JavaScript code JSB namespce can be recognized
void register_all(JSContext* cx, JSObject* obj){
jsval nsval;
JSObject* ns;
JS_GetProperty(cx, obj, "JS", &nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "JSB", &nsval);
}
else{
JS_ValueToObject(cx, nsval, &ns);
}
obj = ns;
js_register(cx, obj);
}
現在已經完成了大部分工作,但是我們需要在「SpiderMonkey」進行注冊。
打開「AppDelegate.cpp」增加以下代碼
ScriptingCore* sc = ScriptingCore::getInstance();
sc->addRegisterCallback(register_all); //add this line
步驟3. 內存管理
在register_all函數前增加兩個新函數。
JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->retain();
CCLog("Retain succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->release();
CCLog("Release succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
在register_all函數中增加以下代碼:
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);
步驟4. 使用C++代碼回調Java腳本代碼
在C++代碼回調Java腳本代碼之前增加一些代碼至「hello.js」文件。
var testJSB = new JSB.JSBinding();
testJSB.callback = function(i, j){
log("JSB Callback" + i + j);
};
然後打開「JSBinding.cpp」在「functionTest」中增加一些代碼。
js_proxy_t* p = jsb_get_native_proxy(this);
jsval retval;
jsval v[] = {
v[0] = UINT_TO_JSVAL(32),
v[1] = UINT_TO_JSVAL(88)
};
ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj),
"callback", 2, v, &retval);
使用「executeFunctionWithOwner()」函數簡化函數調用程序
步驟5. 綁定測試
在「hello.js」文件中增加以下代碼。
var testJSB = new JSB.JSBinding();
testJSB.retain();
testJSB.functionTest();
testJSB.release();
步驟6. 現在取出(check out)項目
如果你的綁定程序正確無誤,將會在調試窗口看到如下界面:
恭喜你成功將JS綁定至本地代碼!
3. jsb頁面怎樣接收來自客戶的表單數據
request.getParameter("ID") 如用戶名和密碼
request.getParameterValues("name") 如 checkbox
4. c++ 能不能融合javascript
下載綁定生成器,本機路徑/Users/iven/Dev/bindings-generator
為了在Mac OS X中安裝運行MacPort埠,系統必須要已經安裝蘋果的「Command Line Developer Tools」(命令行開發者工具)。Xcode 4及以後版本的用戶首先需要通過啟動或運行Xcode接受Xcode EULA。
xcodebuild -license
下載安裝MacPort
注意:如果是Homebrew用戶,應該先卸載Homebrew。因為Homebrew不兼容MacPort。
同時執行MacPort的「selfupdate」命令以確保安裝最新的發布版本。
sudo port -v selfupdate
當更新完成之後,使用MacPort在命令行中安裝python依賴(dependencies)
sudo port install python27 py27-yaml py27-cheetah
你會看到如下所示:
下載llvm-3.3,解壓至$HOME/bin目錄。如果沒有bin目錄,請創建一個bin目錄,將未解壓的ZIP壓縮包重命名為「clang+llvm-3.3」。
最後目錄如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本機的主目錄名字)
樣本代碼
綁定生成器資源庫中包括一個樣本測試用例。打開bindings-generator/test/simple_test文件夾。
配置
根據自己的環境個性化設置「test/userconf.ini」和「test/user.cfg」文件。
注意:應該移除後綴為「.sample」的文件如「user.cfg.sample」和「userconf.ini.sample」
[DEFAULT]
androidndkdir=/Users/iven/Dev/android-ndk-r8c
clangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11
cxxgeneratordir=/Users/iven/Dev/bindings-generator-master
user.cfg配置如下所示
PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7
運行測試樣本
./test.sh
如果環境設置正確,你會看到如下所示:
Errors in parsing headers:
1. <severity = Warning,
location =<SourceLocation file None, line 0, column 0>,
details = "argument unusedring compilation: '-nostdinc++'">
不用擔心這個警告,你已完成運行,測試用例會創建一個包含3個文件的「simple_test_bindings」目錄。
一個綁定類的.hpp頭文件
一個實現綁定類的.cpp文件
一個介紹如何(從Java腳本)調用C++類暴露方法的.js文件。
運行測試
Create a JS base Cocos2d-x project. 創建基於JS的Cocos2d-x項目
將「simple_Test folder」文件夾和「simple_test_binding」文件夾添加到項目中
修改「autogentestbindings.cpp」中的注冊函數如下:
void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {
jsval nsval;
JSObject *ns;
JS_GetProperty(cx, obj, "ts",&nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "ts",&nsval);
} else {
JS_ValueToObject(cx,nsval, &ns);
}
obj = ns;
js_register_autogentestbindings_SimpleNativeClass(cx, obj);
}
注意:如果你將「ts」添加到「test.ini」文件中的「target_namespace」變數里,便會自動生成代碼。無需修改。
target_namespace =ts
在「AppDelegate」中注冊
包含頭文件「autogentestbindings.hpp」然後注冊回調函數:
sc->addRegisterCallback(register_all_autogentestbindings);
在「hello.js」文件適當地方增加以下代碼。本機將「init f」函數放在第一個場景。
var myClass=new ts.SimpleNativeClass();
var myStr=myClass.returnsACString();
var label = cc.LabelTTF.create(myStr, "Helvetica", 20.0);
限制
綁定生成器存在以下兩個限制
自變數數字參數無法工作,所以需要手動編寫包裝器
代表類無法工作,所以需要手動綁定,詳見下一部分。
手動 JSB 綁定
本指南將介紹利用Cocos2d-x 2.14模板如何在自己的項目中實現JSB綁定。
首先用Cocos2d-js模板創建項目。其次,我們會介紹如何一步一步從JS調用本地函數。最後你便會學會如何從本地代碼調用JS代碼了。
現在讓我們開始!本機使用的Mac OS X作為開發環境。
步驟1. 用Cocos2dx-js模板創建新項目,同時新建一個即將綁定至JS的C++類。
將項目命名為「JSBinding」然後點擊「Next」、「 Create」
新建一個類然後實現這個類,等會再將其綁定至JS。
按「command+N」新建一個C++類並命名為「JSBinding」,路徑為「OS X\C and C++\C++ Class」。
將以下代碼添加到「JSBinding.h」文件中。
#include "cocos2d.h"
#include "ScriptingCore.h"
// Define a namespace to manage your code and make your code clearly
namespace JSB {
class JSBinding: public cocos2d::CCObject
{
public:
static cocos2d::CCScene* scene();
virtual bool init();
CREATE_FUNC(JSBinding);
void functionTest();
};
}
現在實現JSBinding.cpp中的類。如下所示:
bool JSB::JSBinding::init(){
bool bRef = false;
do{
cocos2d::CCLog("JSB init...");
bRef = true;
} while (0);
return bRef;
}
void JSB::JSBinding::functionTest(){
cocos2d::CCLog("Function test...");
}
步驟2. 將C++代碼綁定至Java腳本代碼
按「command+N」新建C++類,然後命名「JSB_AUTO」路徑「OS X\C and C++\C++ Class」。
往「JSB_AUTO.h」文件中增加一些代碼
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意「JSB_AUTO.cpp」的實現。
#include "cocos2d.h"
#include "cocos2d_specifics.hpp"
// Binding specific object by defining JSClass
JSClass* jsb_class;
JSObject* jsb_prototype;
// This function is mapping the function 「functionTest」 in 「JSBinding.cpp」
JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){
JSBool ok = JS_TRUE;
JSObject* obj = NULL;
JSB::JSBinding* cobj = NULL;
obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t* proxy = jsb_get_js_proxy(obj);
cobj = (JSB::JSBinding* )(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2(cobj, cx, JS_FALSE, "Invalid Native Object");
if (argc == 0) {
cobj->functionTest();
JS_SET_RVAL(cx, vp, JSVAL_VOID);
return ok;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("JS Constructor...");
if (argc == 0) {
JSB::JSBinding* cobj = new JSB::JSBinding();
cocos2d::CCObject* ccobj = dynamic_cast<cocos2d::CCObject*>(cobj);
if (ccobj) {
ccobj->autorelease();
}
TypeTest<JSB::JSBinding> t;
js_type_class_t* typeClass;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, typeClass);
assert(typeClass);
JSObject* obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
js_proxy_t* p = jsb_new_proxy(cobj, obj);
JS_AddNamedObjectRoot(cx, &p->obj, "JSB::JSBinding");
return JS_TRUE;
}
JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);
return JS_FALSE;
}
// This function is mapping the function 「create」 when using JavaScript code
JSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("js is creating...");
if (argc == 0) {
JSB::JSBinding* ret = JSB::JSBinding::create();
jsval jsret;
do{
if (ret) {
js_proxy_t* proxy = js_get_or_create_proxy<JSB::JSBinding>(cx, ret);
jsret = OBJECT_TO_JSVAL(proxy->obj);
}
else{
jsret = JSVAL_NULL;
}
} while(0);
JS_SET_RVAL(cx, vp, jsret);
return JS_FALSE;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
void js_finalize(JSFreeOp* fop, JSObject* obj){
CCLOGINFO("JSBindings: finallizing JS object %p JSB", obj);
}
// Binding JSB type
void js_register(JSContext* cx, JSObject* global){
jsb_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_class->name = "JSBinding";
jsb_class->addProperty = JS_PropertyStub;
jsb_class->delProperty = JS_PropertyStub;
jsb_class->getProperty = JS_PropertyStub;
jsb_class->setProperty = JS_StrictPropertyStub;
jsb_class->enumerate = JS_EnumerateStub;
jsb_class->resolve = JS_ResolveStub;
jsb_class->convert = JS_ConvertStub;
jsb_class->finalize = js_finalize;
jsb_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
// Binding functionTest function
static JSFunctionSpec funcs[] = {
JS_FN("functionTest", js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding create() function
static JSFunctionSpec st_funcs[] = {
JS_FN("create", js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding constructor function and prototype
jsb_prototype = JS_InitClass(
cx, global,
NULL,
jsb_class,
js_constructor, 0,
properties,
funcs,
NULL,
st_funcs);
JSBool found;
JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, &found);
TypeTest<JSB::JSBinding> t;
js_type_class_t* p;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, p);
if (!p) {
p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));
p->type = typeId;
p->jsclass = jsb_class;
p->proto = jsb_prototype;
p->parentProto = NULL;
HASH_ADD_INT(_js_global_type_ht, type, p);
}
}
// Binding JSB namespace so in JavaScript code JSB namespce can be recognized
void register_all(JSContext* cx, JSObject* obj){
jsval nsval;
JSObject* ns;
JS_GetProperty(cx, obj, "JS", &nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "JSB", &nsval);
}
else{
JS_ValueToObject(cx, nsval, &ns);
}
obj = ns;
js_register(cx, obj);
}
現在已經完成了大部分工作,但是我們需要在「SpiderMonkey」進行注冊。
打開「AppDelegate.cpp」增加以下代碼
ScriptingCore* sc = ScriptingCore::getInstance();
sc->addRegisterCallback(register_all); //add this line
步驟3. 內存管理
在register_all函數前增加兩個新函數。
JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->retain();
CCLog("Retain succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->release();
CCLog("Release succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
在register_all函數中增加以下代碼:
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);
步驟4. 使用C++代碼回調Java腳本代碼
在C++代碼回調Java腳本代碼之前增加一些代碼至「hello.js」文件。
var testJSB = new JSB.JSBinding();
testJSB.callback = function(i, j){
log("JSB Callback" + i + j);
};
然後打開「JSBinding.cpp」在「functionTest」中增加一些代碼。
js_proxy_t* p = jsb_get_native_proxy(this);
jsval retval;
jsval v[] = {
v[0] = UINT_TO_JSVAL(32),
v[1] = UINT_TO_JSVAL(88)
};
ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj),
"callback", 2, v, &retval);
使用「executeFunctionWithOwner()」函數簡化函數調用程序
步驟5. 綁定測試
在「hello.js」文件中增加以下代碼。
var testJSB = new JSB.JSBinding();
testJSB.retain();
testJSB.functionTest();
testJSB.release();
步驟6. 現在取出(check out)項目
如果你的綁定程序正確無誤,將會在調試窗口看到如下界面:
恭喜你成功將JS綁定至本地代碼!
5. 初一英語jsjsb
1,He thinks his boss is unusual. 2.Robinson is his boss's dog. 3.It means I also have a boss. 4.It is brown. 5.He knows his boss is out.
6. 瘋狂的阿里巴巴: 鏈接: http://pan.baidu.com/s/1pKJSB5D 怎麼打開
親,你這個鏈接是網路雲的分享鏈接,把鏈接復制到瀏覽器里,輸入提取碼就可以提取文件了。如果你是手機可以復制到q上,然後進行跳轉也能打開鏈接的。
7. PK和JSB分別是什麼意思的縮寫
PK:
1.psychokinesis n.心靈致動(指固體物件在精神感應的作用 ,下被移動的現象)
2.Pakistan 巴基斯坦
3.player killer 攻擊和對打
縮寫詞JSB:
JSB japan satellite broadcasting inc 日本廣播衛星公司
JSB-- 約瑟夫·史密斯
英文縮寫 (Acronym):
JSB
中文全稱 (Chinese): 約瑟夫·史密斯
英文全稱(English): Joseph Smith Building
JSB : Judicial Studies Board (UK)
中文全稱:司法研究委員會(英國)
JSB : Johann Sebastian Bach
中文全稱:巴哈
JSB : Jay and Silent Bob 周傑倫和沉默鮑勃JSB : Joint Service Board 聯合服務JSB : Jimmy Swift Band (rock band) 吉米·斯威夫特(的搖滾樂隊)JSB : Joint Synthetic Battlespace 聯合合成作戰JSB : J S B Financial, Inc. 金融公司是B的研究[J].JSB : Joseph Smith Building 約瑟夫·史密斯</b>
JSB: JOINT-STOCK BANK
8. 怎麼在confd的模板函數中設置變數
為了在Mac OS X中安裝運行MacPort埠,系統必須要已經安裝蘋果的逗Command Line Developer Tools地(命令行開發者工具)。Xcode 4及以後版本的用戶首先需要通過啟動或運行Xcode接受Xcode EULA。
xcodebuild -license
下載安裝MacPort
注意:如果是Homebrew用戶,應該先卸載Homebrew。因為Homebrew不兼容MacPort。
同時執行MacPort的逗selfupdate地命令以確保安裝最新的發布版本。
sudo port -v selfupdate
當更新完成之後,使用MacPort在命令行中安裝python依賴(dependencies)
sudo port install python27 py27-yaml py27-cheetah
你會看到如下所示:
下載llvm-3.3,解壓至$HOME/bin目錄。如果沒有bin目錄,請創建一個bin目錄,將未解壓的ZIP壓縮包重命名為逗clang+llvm-3.3地。
最後目錄如下所示:/Users/guanghui/bin/clang+llvm-3.3(guanhui是本機的主目錄名字)
樣本代碼
綁定生成器資源庫中包括一個樣本測試用例。打開bindings-generator/test/simple_test文件夾。
配置
根據自己的環境個性化設置逗test/userconf.ini地和逗test/user.cfg地文件。
注意:應該移除後綴為逗.sample地的文件如逗user.cfg.sample地和逗userconf.ini.sample地
[DEFAULT]
androidndkdir=/Users/iven/Dev/android-ndk-r8c
clangllvmdir=/Users/iven/Dev/clang+llvm-3.1-x86_64-apple-darwin11
cxxgeneratordir=/Users/iven/Dev/bindings-generator-master
user.cfg配置如下所示
PYTHON_BIN=/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/ python2.7
運行測試樣本
./test.sh
如果環境設置正確,你會看到如下所示:
Errors in parsing headers:
1. <severity = Warning,
location =<SourceLocation file None, line 0, column 0>,
details = "argument unusedring compilation: '-nostdinc++'">
不用擔心這個警告,你已完成運行,測試用例會創建一個包含3個文件的逗simple_test_bindings地目錄。
一個綁定類的.hpp頭文件
一個實現綁定類的.cpp文件
一個介紹如何(從Java腳本)調用C++類暴露方法的.js文件。
運行測試
Create a JS base Cocos2d-x project. 創建基於JS的Cocos2d-x項目
將逗simple_Test folder地文件夾和逗simple_test_binding地文件夾添加到項目中
修改逗autogentestbindings.cpp地中的注冊函數如下:
void register_all_autogentestbindings(JSContext* cx, JSObject* obj) {
jsval nsval;
JSObject *ns;
JS_GetProperty(cx, obj, "ts",&nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "ts",&nsval);
} else {
JS_ValueToObject(cx,nsval, &ns);
}
obj = ns;
js_register_autogentestbindings_SimpleNativeClass(cx, obj);
}
注意:如果你將逗ts地添加到逗test.ini地文件中的逗target_namespace地變數里,便會自動生成代碼。無需修改。
target_namespace =ts
在逗AppDelegate地中注冊
包含頭文件逗autogentestbindings.hpp地然後注冊回調函數:
sc->addRegisterCallback(register_all_autogentestbindings);
在逗hello.js地文件適當地方增加以下代碼。本機將逗init f地函數放在第一個場景。
var myClass=new ts.SimpleNativeClass();
var myStr=myClass.returnsACString();
var label = cc.LabelTTF.create(myStr, "Helvetica", 20.0);
限制
綁定生成器存在以下兩個限制
自變數數字參數無法工作,所以需要手動編寫包裝器
代表類無法工作,所以需要手動綁定,詳見下一部分。
手動 JSB 綁定
本指南將介紹利用Cocos2d-x 2.14模板如何在自己的項目中實現JSB綁定。
首先用Cocos2d-js模板創建項目。其次,我們會介紹如何一步一步從JS調用本地函數。最後你便會學會如何從本地代碼調用JS代碼了。
現在讓我們開始!本機使用的Mac OS X作為開發環境。
步驟1. 用Cocos2dx-js模板創建新項目,同時新建一個即將綁定至JS的C++類。
將項目命名為逗JSBinding地然後點擊逗Next地、逗 Create地
新建一個類然後實現這個類,等會再將其綁定至JS。
按逗command+N地新建一個C++類並命名為逗JSBinding地,路徑為逗OS X\C and C++\C++ Class地。
將以下代碼添加到逗JSBinding.h地文件中。
#include "cocos2d.h"
#include "ScriptingCore.h"
// Define a namespace to manage your code and make your code clearly
namespace JSB {
class JSBinding: public cocos2d::CCObject
{
public:
static cocos2d::CCScene* scene();
virtual bool init();
CREATE_FUNC(JSBinding);
void functionTest();
};
}
現在實現JSBinding.cpp中的類。如下所示:
bool JSB::JSBinding::init(){
bool bRef = false;
do{
cocos2d::CCLog("JSB init...");
bRef = true;
} while (0);
return bRef;
}
void JSB::JSBinding::functionTest(){
cocos2d::CCLog("Function test...");
}
步驟2. 將C++代碼綁定至Java腳本代碼
按逗command+N地新建C++類,然後命名逗JSB_AUTO地路徑逗OS X\C and C++\C++ Class地。
往逗JSB_AUTO.h地文件中增加一些代碼
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意逗JSB_AUTO.cpp地的實現。
#include "jsapi.h"
#include "jsfriendapi.h"
#include "ScriptingCore.h"
#include "JSBinding.h"
void register_all(JSContext* cx, JSObject* obj);
然後注意逗JSB_AUTO.cpp地的實現。
#include "cocos2d.h"
#include "cocos2d_specifics.hpp"
// Binding specific object by defining JSClass
JSClass* jsb_class;
JSObject* jsb_prototype;
// This function is mapping the function 逗functionTest地 in 逗JSBinding.cpp地
JSBool js_functionTest(JSContext* cx, uint32_t argc, jsval* vp){
JSBool ok = JS_TRUE;
JSObject* obj = NULL;
JSB::JSBinding* cobj = NULL;
obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t* proxy = jsb_get_js_proxy(obj);
cobj = (JSB::JSBinding* )(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2(cobj, cx, JS_FALSE, "Invalid Native Object");
if (argc == 0) {
cobj->functionTest();
JS_SET_RVAL(cx, vp, JSVAL_VOID);
return ok;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
JSBool js_constructor(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("JS Constructor...");
if (argc == 0) {
JSB::JSBinding* cobj = new JSB::JSBinding();
cocos2d::CCObject* ccobj = dynamic_cast<cocos2d::CCObject*>(cobj);
if (ccobj) {
ccobj->autorelease();
}
TypeTest<JSB::JSBinding> t;
js_type_class_t* typeClass;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, typeClass);
assert(typeClass);
JSObject* obj = JS_NewObject(cx, typeClass->jsclass, typeClass->proto, typeClass->parentProto);
JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj));
js_proxy_t* p = jsb_new_proxy(cobj, obj);
JS_AddNamedObjectRoot(cx, &p->obj, "JSB::JSBinding");
return JS_TRUE;
}
JS_ReportError(cx, "Wrong number of arguments: %d, was expecting: %d", argc, 0);
return JS_FALSE;
}
// This function is mapping the function 逗create地 when using JavaScript code
JSBool js_create(JSContext* cx, uint32_t argc, jsval* vp){
cocos2d::CCLog("js is creating...");
if (argc == 0) {
JSB::JSBinding* ret = JSB::JSBinding::create();
jsval jsret;
do{
if (ret) {
js_proxy_t* proxy = js_get_or_create_proxy<JSB::JSBinding>(cx, ret);
jsret = OBJECT_TO_JSVAL(proxy->obj);
}
else{
jsret = JSVAL_NULL;
}
} while(0);
JS_SET_RVAL(cx, vp, jsret);
return JS_FALSE;
}
JS_ReportError(cx, "Wrong number of arguments");
return JS_FALSE;
}
void js_finalize(JSFreeOp* fop, JSObject* obj){
CCLOGINFO("JSBindings: finallizing JS object %p JSB", obj);
}
// Binding JSB type
void js_register(JSContext* cx, JSObject* global){
jsb_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_class->name = "JSBinding";
jsb_class->addProperty = JS_PropertyStub;
jsb_class->delProperty = JS_PropertyStub;
jsb_class->getProperty = JS_PropertyStub;
jsb_class->setProperty = JS_StrictPropertyStub;
jsb_class->enumerate = JS_EnumerateStub;
jsb_class->resolve = JS_ResolveStub;
jsb_class->convert = JS_ConvertStub;
jsb_class->finalize = js_finalize;
jsb_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
{0, 0, 0, JSOP_NULLWRAPPER, JSOP_NULLWRAPPER}
};
// Binding functionTest function
static JSFunctionSpec funcs[] = {
JS_FN("functionTest", js_functionTest, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding create() function
static JSFunctionSpec st_funcs[] = {
JS_FN("create", js_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
// Binding constructor function and prototype
jsb_prototype = JS_InitClass(
cx, global,
NULL,
jsb_class,
js_constructor, 0,
properties,
funcs,
NULL,
st_funcs);
JSBool found;
JS_SetPropertyAttributes(cx, global, "JSB", JSPROP_ENUMERATE | JSPROP_READONLY, &found);
TypeTest<JSB::JSBinding> t;
js_type_class_t* p;
uint32_t typeId = t.s_id();
HASH_FIND_INT(_js_global_type_ht, &typeId, p);
if (!p) {
p = (js_type_class_t* )malloc(sizeof(_js_global_type_ht));
p->type = typeId;
p->jsclass = jsb_class;
p->proto = jsb_prototype;
p->parentProto = NULL;
HASH_ADD_INT(_js_global_type_ht, type, p);
}
}
// Binding JSB namespace so in JavaScript code JSB namespce can be recognized
void register_all(JSContext* cx, JSObject* obj){
jsval nsval;
JSObject* ns;
JS_GetProperty(cx, obj, "JS", &nsval);
if (nsval == JSVAL_VOID) {
ns = JS_NewObject(cx, NULL, NULL, NULL);
nsval = OBJECT_TO_JSVAL(ns);
JS_SetProperty(cx, obj, "JSB", &nsval);
}
else{
JS_ValueToObject(cx, nsval, &ns);
}
obj = ns;
js_register(cx, obj);
}
現在已經完成了大部分工作,但是我們需要在逗SpiderMonkey地進行注冊。
打開逗AppDelegate.cpp地增加以下代碼
ScriptingCore* sc = ScriptingCore::getInstance();
sc->addRegisterCallback(register_all); //add this line
步驟3. 內存管理
在register_all函數前增加兩個新函數。
JSBool JSB_cocos2dx_retain(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->retain();
CCLog("Retain succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
JSBool JSB_cocos2dx_release(JSContext* cx, uint32_t argc, jsval *vp){
JSObject* thisObj = JS_THIS_OBJECT(cx, vp);
if (thisObj) {
js_proxy_t* proxy = jsb_get_js_proxy(thisObj);
if (proxy) {
((CCObject* )proxy->ptr)->release();
CCLog("Release succeed!");
return JS_TRUE;
}
}
JS_ReportError(cx, "Invaild native object");
return JS_FALSE;
}
在register_all函數中增加以下代碼:
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_retain, 0, JSPROP_READONLY | JSPROP_PERMANENT);
JS_DefineFunction(cx, jsb_prototype, "retain", JSB_cocos2dx_release, 0, JSPROP_READONLY | JSPROP_PERMANENT);
步驟4. 使用C++代碼回調Java腳本代碼
在C++代碼回調Java腳本代碼之前增加一些代碼至逗hello.js地文件。
var testJSB = new JSB.JSBinding();
testJSB.callback = function(i, j){
log("JSB Callback" + i + j);
};
然後打開逗JSBinding.cpp地在逗functionTest地中增加一些代碼。
js_proxy_t* p = jsb_get_native_proxy(this);
jsval retval;
jsval v[] = {
v[0] = UINT_TO_JSVAL(32),
v[1] = UINT_TO_JSVAL(88)
};
ScriptingCore::getInstance()->executeFunctionWithOwner(OBJECT_TO_JSVAL(p->obj),
"callback", 2, v, &retval);
使用逗executeFunctionWithOwner()地函數簡化函數調用程序
步驟5. 綁定測試
在逗hello.js地文件中增加以下代碼。
var testJSB = new JSB.JSBinding();
testJSB.retain();
testJSB.functionTest();
testJSB.release();
步驟6. 現在取出(check out)項目
如果你的綁定程序正確無誤,將會在調試窗口看到如下界面:
恭喜你成功將JS綁定至本地代碼!