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