admin';?>

首页 / Development & communication

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

By admin •  2018-09-25 10:46:41 •  282次点击
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-06-26 15:15添加回复

回复

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

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

现在注册 已注册请 登入
Development & communication

节点列表