ffiを使用してnodejsでダイナミックリンクライブラリ(.soファイル)を呼び出す

4628 ワード

  • ffiを介してnodejsで動的リンクライブラリsodllファイルを呼び出す
  • の概要
  • なぜnodejsで動的リンクライブラリ
  • を呼び出すのか
  • ffi概要とインストール
  • 注意事項
  • オムレツ栗
  • Cインタフェースのポインタ内容
  • を取得する.
  • 非同期呼び出し
  • 実例

  • ffiを介してnode.jsでダイナミックリンクライブラリ(.so/.dllファイル)を呼び出す
    概要
    どうしてnodeにいるの?jsで動的リンクライブラリを呼び出す
  • テンセントシステムの下の多くの公共のバックグラウンドサービス(L 5,CKV,msgQなど)はすでに非常に成熟したC/C++が作成したAPIを持っているため、アプリケーションの呼び出しに供し、node.jsは、社内で新興のバックグラウンドruntimeとして、これらの公共サービスを呼び出す際に車輪を再構築する必要はなく、これらのAPIをコンパイルすることができる.soファイルは直接使用します.
  • いくつかの密集計算型のタスクはC++によってモジュールを作成し、生成することができる.soファイルの後は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注意事項!
  • ffiはCスタイルのモジュールしか呼び出せません.
  • は、呼び出しのためにCソースbuildを動的リンクライブラリにし、Linuxの下でCソースbuildを.soファイル、windowsの下でbuildを.dllファイルにする必要がある.本文はただ述べるだけだ.soファイルの呼び出し方法、呼び出し.dllの差は大きくない.
  • はLinuxの下でC++で記述するaddonを用いて呼び出す.soファイル、必要です.soファイルはシステム共有です.具体的な方法はldconfigコマンドを参照してください.これはLinuxの下のダイナミックリンクライブラリ管理コマンドです.ldconfigコマンドの主な用途は、デフォルトのディレクトリ(/libおよび/usr/lib)およびダイナミックライブラリプロファイル/etc/ldを検索することです.so.conf内にリストされているディレクトリの下で、lib*.so*などの共有可能な動的リンクライブラリを検索し、動的読み込みプログラム(ld.so)に必要な接続とキャッシュファイルを作成します.キャッシュファイルのデフォルトは/etc/ldです.so.Cache、このファイルは、並べ替えられたダイナミックリンクライブラリ名のリストを保存します.ldconfigは通常、システムの起動時に実行されますが、ユーザーが新しいダイナミックリンクライブラリをインストールした場合、このコマンドを手動で実行する必要があります.

  • オムレツ栗
    ここでは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()を書けばいいと言ってもいいですが、その柔軟性は明らかに上記の考えに及ばないです.