看看 js-ctypes (https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes)
小例子:
Components.utils.import("resource://gre/modules/FileUtils.jsm");
Components.utils.import("resource://gre/modules/ctypes.jsm")
// path to C++ lib (/home/username/.thunderbird/PROFILE/extensions/EXTNAME/components/lib.so)
var libPath = FileUtils.getFile("ProfD", ["extensions", "EXTNAME", "components", "lib.so"]);
var lib = ctypes.open(libPath.path);
var libFunction = lib.declare("concatStrings", // function name in C++ code
ctypes.default_abi,
ctypes.char.ptr, // return value
ctypes.char.ptr, // param1
ctypes.char.ptr // param2
);
var ret = libFunction("abc", "efg");
lib.close()
还要注意,由于函数重载,C++ 编译器确实会进行名称修改,因此您的函数名称在 C++ 代码中可能是“concatStrings”,但在汇编中它可能类似于“_123concatStrings”。为了防止这种情况,请声明您的函数,例如:
extern "C" const char * concatStrings ( const char * str1, const char * str2 );