admin';?>

首页 / 开发交流

js,c++如何互相调用(xpcom 或 jsctypes 均可)

By admin •  2018-09-25 10:46:41 •  213次点击
js与c++的交互,Android下使用消息回调。linux, windows 下有两种方式:
1.xpcom组件。
2.JSctypes。

以下是使用xpcom方式:
c++ call js:
c++ can invoke js directly, and get  string value, which come from js.
bool CMozUtil::InjectJS(nsIDOMWindow* dom, const wchar_t* userScript, char* result)
{
	nsresult rv;

	nsCOMPtr<nsPIDOMWindowOuter> piWin(do_QueryInterface(dom));
	nsCOMPtr<nsIScriptGlobalObject> innerGlobal = do_QueryInterface(piWin);
	nsIDocShell* docShell = piWin->GetDocShell();
	nsCOMPtr<nsIScriptGlobalObject> global(do_GetInterface(docShell));
	
	nsCOMPtr<nsIScriptContext> scriptContext = global->GetContext(); 
	JSObject* jb = scriptContext->GetWindowProxy();
	nsCOMPtr<nsIXPConnect> xpc = do_GetService("@mozilla.org/js/xpc/XPConnect;1");

	mozilla::dom::AutoJSAPI jsapi;
	jsapi.Init();
	JSContext* cx = jsapi.cx();

	JS::Rooted<JSObject*> globalJSObject(cx, innerGlobal->GetGlobalJSObject());
	JSAutoNullableCompartment ac(cx, globalJSObject);

	JS::CompileOptions opts(cx);
	opts.setNoScriptRval(true)
		.setVersion(JSVERSION_LATEST);
	 
	opts.setFileAndLine("ohui", 0);
	opts.setFileAndLine("-e", 1);
	opts.setNoScriptRval(false);

	JS::Rooted<JS::Value> v(cx, JS::UndefinedValue());
	bool bSucc = JS::Evaluate(cx
					    , opts
					    , (const char16_t*)userScript 
					    , wcslen(userScript)
					    , &v);

	if (result && v.isString() && !v.isObject())
	{
		JSString* str = v.toString();
		size_t aLen = JS_GetStringLength(str);

		JS_EncodeStringToBuffer(cx, str, result, aLen);
		result[aLen] = 0;
	}

	return NS_SUCCEEDED(rv);
}


SendToJs():
void CMainFrame::SendToJs()
{ 
	nsIWebBrowserChrome *chrome = 0;
	if (m_pBrowserWrapper && m_pBrowserWrapper->mWebBrowser)
		m_pBrowserWrapper->mWebBrowser->GetContainerWindow(&chrome);

	if (chrome)
		CMozUtil::InjectJS(chrome, m_pCommandData);
}

js call c++:

我们通过g_xpConn这个对象向js暴露调用接口。g_xpConn是一个xpcom组件。我们通过如下方法来引用该组件。

既然是xpcom,肯定是可以用c++来开发了。这样就完成了js对c++的调用。
xpcom组件开发其实就类似于开发dll,具体开发方法及源码工程大家可以观看这里:
xpcom组件开发及demo: http://bbs.otherhill.com/index.php/topic/show/40

以下是使用jsctypes:
Components.utils.import("resource://gre/modules/ctypes.jsm");
var kernel = ctypes.open("kernel32.dll");
var HMODULE = ctypes.uint32_t;
var HWND = ctypes.uint32_t;
var LPCTSTR = ctypes.jschar.ptr;
var LPCSTR = ctypes.char.ptr;
var LoadLibrary = kernel.declare("LoadLibraryW", ctypes.winapi_abi, HMODULE, LPCTSTR);

var GetProcAddress = kernel.declare("GetProcAddress", ctypes.winapi_abi, ctypes.void_t.ptr, HMODULE, LPCSTR);

var hUser = LoadLibrary("user32");
var funcPtr = GetProcAddress(hUser, "MessageBoxW");
var lib = ctypes.open("C:\WINDOWS\system32\user32.dll");
var msgBox = lib.declare("MessageBoxW", ctypes.winapi_abi, ctypes.int32_t, HWND, LPCTSTR, LPCTSTR, ctypes.uint32_t);
var MB_OK = 3;
var ret = msgBox(0, "Hello world", "title", MB_OK);
alert("MessageBox result : "+ret);

lib.close();
kernel.close();

jsctypes reference:
1. https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/js-ctypes_reference/ctypes
2. https://wiki.mozilla.org/JSctypes



0 回复 | 直到2019-03-26 07:46添加回复

回复

登录发表 or 还没有账号?去注册

他山跨平台混合应用开发框架

现在注册 已注册请 登入

节点列表

Demo发布

Windows  Linux  Android  最新进展 

经验交流

功能建议  Windows  Linux  Android  开发交流  资源分享  js  xul 

BUG反馈

Windows  Linux  Android 

学习生活

灌水乐园  大话界面