v8学习笔记(八) 【JS与C++互调】
v8 中JS與C++互調(diào)
**************************v8中JS調(diào)C++:注冊(cè)回調(diào)函數(shù)*****************************
?
JS調(diào)C++數(shù)據(jù):訪問(wèn)器(Accessor)?? (直接訪問(wèn))
(1)定義C++回調(diào)函數(shù)Getter/Setter
(2)Context全局對(duì)象模板(ObjectTemplate)注冊(cè)Getter/Setter
?
?
?
JS調(diào)C++函數(shù):(Context)全局對(duì)象模板ObjectTemplate注冊(cè)回調(diào)函數(shù)(通過(guò)v8::Arguments傳遞參數(shù))
???????? Template::Set(Handle<String> name, Handle<Data> value,PropertyAttribute attributes = None);
?
?
JS調(diào)C++對(duì)象:(通過(guò)CPPObj.XXX訪問(wèn))
1.C++對(duì)象映射成(v8_API)JS對(duì)象,加入JS運(yùn)行時(shí)環(huán)境(Context):?????????????????????????????????? ??????C++類(lèi)映射成ObjectTemplate對(duì)象
?????????????????? (1)創(chuàng)建JS對(duì)象模板ObjectTemplate:???
???????????????????????????????????? Handle<ObjectTemplate> JSObjTempl = ObjectTemplate::New();
?????????????????? (2)設(shè)置對(duì)象模板內(nèi)部域:????????????????
???????????????????????????????????? JSObjTempl->SetInternalFieldCount(1);
?????????????????? (3)創(chuàng)建JS對(duì)象:
???????????????????????????????????? Local<Object> JSObj=JSObjTempl->NewInstance();
?????????????????? (3)C++對(duì)象包裝成(External)外部對(duì)象,放入JS對(duì)象內(nèi)部域:???????
???????????????????????????????????? ClassA* p=new ClassA(3,7);
???????????????????????????????????? Local<External> Ext=External::New(p);
???????????????????????????????????? JSObj->SetInternalField(0,Ext);
?????????????????? (4)JS對(duì)象放入運(yùn)行時(shí)環(huán)境(全局對(duì)象)?
???????????????????????????????????? context->Global()->Set(String::New("ClassA"),JSObj);
????????????????????????????????????
2.調(diào)C++對(duì)象的成員數(shù)據(jù):JS對(duì)象模板注冊(cè)Getter/Setter回調(diào)函數(shù)
?????????????????? JSObjTempl->SetAccessor(String::New("x"),GetCPPObj_X,SetCPPObj_X);
?????????????????? JSObjTempl->SetAccessor(String::New("y"),GetCPPObj_Y,SetCPPObj_Y);
3.調(diào)C++對(duì)象的成員函數(shù):JS對(duì)象模板注冊(cè)回調(diào)函數(shù),通過(guò)回調(diào)函數(shù)調(diào)用成員函數(shù)
?????????????????? JSObjTempl->Set(String::New("method_a"), FunctionTemplate::New(Callback_A));
?????????????????? JSObjTempl->Set(String::New("method_b"), FunctionTemplate::New(Callback_B));
?
??????????????????
回調(diào)函數(shù):(1)(當(dāng)前調(diào)用)JS對(duì)象:
??????????????????????????? Local<Object> self = AccessorInfo.Holder()/Arguments.Holder();
?????????????????? ?(2)(包裝后)外部對(duì)象:
??????????????????????????? Local<External> wrap = Local<External>::Cast(self->GetInternalField(0));
?????????????????? ?(3)C++對(duì)象??????????????????????
??????????????????????????? CPPObj* p = static_cast<CPPObj*>(wrap->Value())
**********************************C++調(diào)JS**************************************
??????????????????
C++調(diào)JS函數(shù):運(yùn)行時(shí)環(huán)境查找JS函數(shù),并調(diào)用
總結(jié)
以上是生活随笔為你收集整理的v8学习笔记(八) 【JS与C++互调】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: v8学习笔记(七) 执行过程
- 下一篇: DLL劫持的发展历程