ffiを使用してnodejsでダイナミックリンクライブラリ(.soファイル)を呼び出す
4628 ワード
ffiを介してnode.jsでダイナミックリンクライブラリ(.so/.dllファイル)を呼び出す
概要
どうしてnodeにいるの?jsで動的リンクライブラリを呼び出す
ffiの概要とインストール
Node-ffiを使用して、ダイナミックリンクライブラリを呼び出すのを支援します.
FFIのフルネームはForeign Function Interfaceで、このプロジェクトは生まれながらにしてNodeJSのローカルコールの問題を解決し、その流れはWindowsの下のLoadLibrary()とGetProcAddress()に相当し、NodeJSの下のプラットフォーム呼び出しとも理解できる.小さなローカル関数を呼び出すためにaddonを作成するのはちょっとやりすぎで、この時、FFIという鶏を殺す刀はずっと手に入れた.これにより、NodeJS環境でJavaScriptにダイナミックリンクライブラリを呼び出すための強力なツールセットが提供されるため、ローカル呼び出しは非常に簡単になります.
notice:本人のnode使用環境は64 bitのLinuxシステムです.ffi:1をインストールします.Node-gyp:
npm install -g node-gyp
をグローバルまたはローカルにインストールし、インストール前にpython 2.7をインストールしますが、node-gypはPython 3をサポートしていません.xなので、Pythonを複数インストールしている読者は、自分の現在のPythonバージョンに注意しなければなりません.Linuxでpythonbrewを押すと、Windowsでは環境変数を変更する必要があります.そしてnodeを使うとjsバージョンは4.0+、node-gypのインストールはC++11構文をサポートするgccに依存し、現在の環境のgccバージョンが少なくとも4.8より高いことを確認する必要があります.2.インストールffi:npm install ffi
注意事項!.so
ファイル、windowsの下でbuildを.dll
ファイルにする必要がある.本文はただ述べるだけだ.soファイルの呼び出し方法、呼び出し.dllの差は大きくない.オムレツ栗
ここではnode-gypを用いる.ccファイル生成nodeファイル、普通私はすべてバックグラウンドの学友を探して私にCソースのファイルをコンパイルするように手伝います.soファイル、それから直接持ってきて使います!ハハハ!この栗はnodejsがCインタフェースを呼び出してメールを送信し、このCのAPIも非常に簡単です.
int send_msg(char * phone, char * content)
パラメータは携帯電話番号とメールの内容で、タイプはすべて
char *
で、戻ったretcodeは1つの整数型で、0を返して送信に成功したことを代表して、その他は失敗で、方法名はsend_ですmsg.次にffiを用いてnodejsでこのインタフェースを呼び出すと、そのインタフェースのソースコードはlibsend_にカプセル化されるmsg.soというダイナミックリンクライブラリは、直接呼び出せばいいです.'use strict'
/**
*
* node 5.0+, node-ffi gcc 4.8+
*/
var ffi = require('ffi');
// int send_msg(char * phone, char * content)
var libm = ffi.Library(__dirname + '/msgQ/libsend_msg', {
'send_msg': ['int', ['string', 'string']]
});
let smsExport = {
sendMsg(opt) {
let phone = opt.phone;
let content = opt.text;
// c ,
let retcode = libm.send_msg(phone, content);
if (retcode === 0) {
// TODO succ
} else {
// TODO fail
}
}
};
module.exports = smsExport;
ffiを使用してCインタフェースパラメータを呼び出す場合、Cの
char *
タイプはnodejsソースコードでstring
タイプで直接表すことができ、nodejsにないint
タイプについてはint
タイプで直接書くこともできる.ここではsend_を同期方式で呼び出すことがわかりますmsgメソッドの.Cインタフェースのポインタの内容を取得する
上の栗はとてもシンプルで、主に伝参と出参のタイプです.JavascriptとCの2つの言語の基本タイプが完全に整列していないため、呼び出すときにパラメータを渡す処理が面倒になることがあります.
ひどうきよびだし
実例
特筆すべきはedgeという名前ですjsのオープンソースプロジェクトは、全体の流れはFFIと似ていますが、C#、Pythonの呼び出しをサポートしているので、かなり面白いです.これで、NodeJSはC/C++、C#、Pythonで拡張できるようになり、潜在力は無限でしょう.もちろん、私が直接他の言語でプログラムを書いてNodeJSでfork()を書けばいいと言ってもいいですが、その柔軟性は明らかに上記の考えに及ばないです.