使用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來進行內存管理,需要你自己對內存進行管理。

例子


參見原文

發佈了32 篇原創文章 · 獲贊 83 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章