得到引擎的實(shí)力單例對象后調(diào)用addRegisterCallback去注冊方法
#ifndef jsb_jsb_kenko_auto_h
#define jsb_jsb_kenko_auto_h
#include "scripting/js-bindings/manual/cocos2d_specifics.hpp"
#include "cocos2d.h"
#define JS_SET_RVAL(cx,vp,v) (*(vp) = (v))
std::string os_info();
bool jsb_os_info(JSContext *cx, uint32_t argc, JS::Value *vp);
void register_jsb_kenko_all(JSContext* cx, JS::HandleObject obj);
bool callJsFunc(JSContext* cx, JS::RootedValue *rv);
#endif
#include "My_Test_Jsb.h"
std::string os_info(std::string str) {
CCLOG("it's c++ os_info here aaa %s",str.c_str());
return "";
}
//參數(shù)格式是固定的丛晦,第二個(gè)參數(shù)是調(diào)用者提供的,而不是JS_DefineFunction設(shè)置的值
//被調(diào)用者的Function對象可以通過這個(gè)指針使用下面描述的宏來訪問崩瓤。
bool jsb_os_info(JSContext *cx, uint32_t argc, JS::Value *vp) {
//JS::CallArgsFromVp為被調(diào)用函數(shù)的封裝,封裝了值,參數(shù),參數(shù)個(gè)數(shù)
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
//JS::CallArgs中封裝的方法查看https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS::CallArgs
bool ok = true;
std::string paramsZero;
CCLOG("the argc number is %d",args.length());
if (args.length() > 0 && args.hasDefined(0)){
JS::HandleValue hv = args.get(0);
if (hv.isString()){
ok &= jsval_to_std_string(cx, hv, ¶msZero);//JS中的字符串由0到多個(gè)16位的unicode字符組成
}
}
CCLOG("the params is %s", paramsZero.c_str());
//判斷參數(shù)存在并且轉(zhuǎn)換成功
if (!ok){
ok = true;
return false;
}
args.rval();
jsval ret = std_string_to_jsval(cx, os_info(paramsZero));//這里是設(shè)置返回值
//成功的話,必須使用JS::CallArgs::rval() 或者 JS_SET_RVAL返回true,否則會(huì)報(bào)告錯(cuò)誤
JS_SET_RVAL(cx, vp, ret);
return true;
}
void register_jsb_kenko_all(JSContext* cx, JS::HandleObject obj) {
//第二個(gè)參數(shù)是為哪個(gè)對象定義函數(shù)作為屬性安聘,引用一個(gè)已經(jīng)扎根于其他地方的T。 這是一個(gè)最有用的參數(shù)類型瓢棒,它可以保證T值正確扎根浴韭。
//詳細(xì)看https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS::Handle
//第四個(gè)參數(shù)是當(dāng)調(diào)用函數(shù)的時(shí)候傳遞的參數(shù)個(gè)數(shù),
//第五個(gè)參數(shù)是JS對象的屬性集(任何對象都可以有0個(gè)或多個(gè)屬性集脯宿,下例中JSPROP_PERMANENT表示屬性不可被刪除)
JS_DefineFunction(cx, obj, "osInfo", jsb_os_info, 1, JSPROP_READONLY | JSPROP_PERMANENT); //生成名為osInfo的js全局函數(shù)
}
bool callJsFunc(JSContext* cx, JS::RootedValue* rv){
int State = 50;
char* buf = new char[64];
sprintf(buf, "prepareForCpp(%d)", State);
//jsval
JS::MutableHandleValue handle(rv);//和handle相似念颈,只是它保存的值可以改變
return ScriptingCore::getInstance()->evalString(buf, handle);
}
引擎啟動(dòng)之后調(diào)用
//以下代碼為讀取js返回的值
JSContext *cx = ScriptingCore::getInstance()->getGlobalContext();
JS::RootedValue rv(cx);
callJsFunc(cx,&rv);
if (rv.isObject()){
CCLOG("object");
}
else if (rv.isPrimitive()){
CCLOG("primitive");
}
int back = rv.toInt32();
CCLOG("the value is %d",back);