使用js-ctypes

译注:在学习使用js-ctypes的过程中遇到困难,于是仔细的看了这篇文章并对我感觉重要的地方进行了翻译,加之原文有些地方仍然会有改动。在看译文的过程中如有疑惑,请参考原文。 使用js-ctypes
导入 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下,搜索顺序如下:
  1. The application's directory.
  2. The system directory.
  3. The 16-bit system directory.
  4. The Windows directory.
  5. The current working directory
  6. 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来进行内存管理,需要你自己对内存进行管理。

例子


参见原文

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值