译注:在学习使用js-ctypes的过程中遇到困难,于是仔细的看了这篇文章并对我感觉重要的地方进行了翻译,加之原文有些地方仍然会有改动。在看译文的过程中如有疑惑,请参考原文。
使用js-ctypes
导入 ctypes.jsm方法如下:
Components.utils.import("resource://gre/modules/ctypes.jsm")
返回的是一个Library对象,你可以用它来声明所加载的函数库要使用的函数和数据类型。
Js-ctypes只能使用C库,不可以直接使用C++库,但是你可以用C函数封装一个调用了C++库的函数库来使用。
如果没有成功关闭,则会在垃圾回收时进行自动关闭。
一旦声明了类型和函数,你就可以编写代码来使用它们了,C数据对象的示例及参考在文章使用数据一文中。
当二进制代码交回一个分配内存的指针或句柄,JS代码必须确保在正确的地方进行释放。通常最好的方式是在二进制代码库中添加一个释放函数。
使用declare()方法声明的函数或static数据会使得那个library存在
一个CType会保持其指示的CType对象存在
一个CData会在特定的环境中保持其指示的CData对象存在,例如:访问某个结构体或者数组内部的数据产生的CData对象会保持对应的对象存在
不确定的时候 malloc()
当你绝对的需要保持数据的存在时,你可以使用malloc()来直接分配内存。这不由javascript来进行内存管理,需要你自己对内存进行管理。
参见原文
导入 ctypes.jsm方法如下:
Components.utils.import("resource://gre/modules/ctypes.jsm")
加载本地库
导入了代码模块之后,可以使用ctypes.open()方法来加载本地库了。加载user32库方式如下:var lib = ctypes.open("user32.dll");返回的是一个Library对象,你可以用它来声明所加载的函数库要使用的函数和数据类型。
Js-ctypes只能使用C库,不可以直接使用C++库,但是你可以用C函数封装一个调用了C++库的函数库来使用。
库的搜索路径
在windows下,搜索顺序如下:- The application's directory.
- The system directory.
- The 16-bit system directory.
- The Windows directory.
- The current working directory
- The directories listed in the PATH environment variable.
完成之后
使用完一个库之后,需要调用Library对象的close方法来关闭:lib.close();如果没有成功关闭,则会在垃圾回收时进行自动关闭。
使用库
可能需要声明新的类型(简单类型或者复杂类型如:结构体)。详情见声明类型,基本上都需要声明一个或多个函数,那样才可用调用它们。一旦声明了类型和函数,你就可以编写代码来使用它们了,C数据对象的示例及参考在文章使用数据一文中。
声明类型
上述内容位于 此处声明并调用函数
上述内容位于 此处使用数据
上述内容位于 此处内存管理
如果JS代码创建了一个结构体或者数组,其内存就会在该对象存在期间可用。那片内存的指针必须进行咨询的管理,以确保该内存仍然有效。当二进制代码交回一个分配内存的指针或句柄,JS代码必须确保在正确的地方进行释放。通常最好的方式是在二进制代码库中添加一个释放函数。
保持对象存在
下面的js-ctypes对象将会保持对象的引用,保持它们的存在。这不是一个详细的清单,但是可以帮助你理解内存管理以及如何影响你对js-ctypes的使用。使用declare()方法声明的函数或static数据会使得那个library存在
一个CType会保持其指示的CType对象存在
一个CData会在特定的环境中保持其指示的CData对象存在,例如:访问某个结构体或者数组内部的数据产生的CData对象会保持对应的对象存在
什么不会保持对象存在
非常需要注意的地方是使用address()方法,和addressOfElement()方法,或者contents直接访问一个CData对象的内容得到的结果是一个CData对象,这个对象并没有保持其应用的存在。。确保一个对象有一个明确的引用以使其不会在你使用完之前被回收。结论
你还需要确保对任何本地代码可能从新调用的javascript代码的引用的获取。这很明显,但是值得明确的指出来。不确定的时候 malloc()
当你绝对的需要保持数据的存在时,你可以使用malloc()来直接分配内存。这不由javascript来进行内存管理,需要你自己对内存进行管理。
例子
略参见原文