v8中js創建以及調用c++類的實現

通過v8,可以封裝c++中的對象供js調用:
</pre><span style="white-space:pre">	</span>global->Set(v8::String::NewFromUtf8(GetIsolate(), "SetName"),<span style="white-space:pre">		</span>v8::FunctionTemplate::New(GetIsolate(), MineScript::SetName));<span style="white-space:pre">	</span><span style="white-space:pre">	</span>v8::Handle<v8::Context> context=Context::New(GetIsolate(),NULL,global);<span style="white-space:pre">	</span><span style="white-space:pre">	</span>//context->DetachGlobal();<span style="white-space:pre">	</span>Context::Scope context_scope(context);<span style="white-space:pre">	</span>Handle<Object> result = global->NewInstance();<span style="white-space:pre">	</span>Handle<External> request_ptr = External::New(GetIsolate(),m_pBase);<span style="white-space:pre">	</span>result->SetInternalField(0, request_ptr);<span style="white-space:pre">	</span>context->Global()->Set(v8::String::NewFromUtf8(GetIsolate(), "point"), result);<pre name="code" class="cpp">

這樣,在js中直接通過

point.SetName();

就可以調用c++中point對象的SetName()函數了。


但是如何直接在js中創建一個c++對象實例、如何在c++中創建一個js對象呢??

這個就得用到FunctionTemplate了

Handle<FunctionTemplate> minebase_template = 
		FunctionTemplate::New(GetIsolate(),MinebaseConstructCallback);
	minebase_template->SetClassName(v8::String::NewFromUtf8(isolate_,"JsMinebase"));
	Handle<ObjectTemplate> minebase_proto = minebase_template->PrototypeTemplate();
	minebase_proto->Set(v8::String::NewFromUtf8(GetIsolate(),"SetMinebaseName"), FunctionTemplate::New(GetIsolate(),SetMinebaseName));
	Handle<ObjectTemplate> cloudapp_inst = minebase_template->InstanceTemplate();
	cloudapp_inst->SetInternalFieldCount(1);
	global->Set(v8::String::NewFromUtf8(GetIsolate(),"JsMinebase"), minebase_template);

以上代碼就是通過c++在v8引擎中構建一個js的類:JsMinebase,這樣就可以在js中直接創建JsMinebase對象了,類似

<pre name="code" class="javascript">var obj=new JsMinebase();


而要在js中創建c++中的類的實例,則通過MinebaseConstructCallback中來進行實現了,在其中既可創建c++中的對象,也可將找到的某個對象封裝到obj中

void MinebaseConstructCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
	if (!args.IsConstructCall())
		return /*Undefined(pCurMineMgr->isolate)*/;
	CMineBase* cloudapp;
	if (args.Length()==1)
	{
		int r = args[0]->Int32Value();
		cloudapp = pCurMineMgr->FindMineObjectByID(r);
	}
	if (args.Length()==2)
	{

		Handle<Value> arg = args[0];
		v8::String::Utf8Value valuename(arg);
		cloudapp = pCurMineMgr->FindMineObject("節點",*valuename);
	}
	Handle<Object> object = args.This();
	object->SetInternalField(0, External::New(pCurMineMgr->isolate,cloudapp)/*MakeWeakCloudApp(cloudapp)*/);
}

這樣,就達到了在js中創建c++對象的目的,然後就可以調用其函數了,當然,調用的函數也需要進行封裝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章