zoukankan      html  css  js  c++  java
  • nodejs addon c++ 连接其他库文件 node-gyp

    1. 使用静态库

    1, test.js

    var addon = require('./hello');
    
    var mpsse = addon.hello();
    
    console.log(mpsse.x); 
    

    2, hello.cpp

    #include <node.h>
    #include <v8.h>
    
    #include "NFCInfo.h" //外部静态库的头文件
    
    using namespace v8;
    
    //静态类用作全局变量,可以返回js对象。 class JSNFC{ public: static void init(Handle<Object> target){ nfcObj = Object::New(); nfcObj->Set(String::NewSymbol("x"), Integer::New(10) ); } static Handle<Object> nfcObj; }; Handle<Object> JSNFC::nfcObj; Handle<Value> Method(const Arguments& args) { HandleScope scope;

      //测试的外部静态类方法   NFCInfo nfc("NFC");   nfc.writeSmartposter("zhibin","232323");
     return scope.Close( JSNFC::nfcObj ); } void init(Handle<Object> target) { target->Set(String::NewSymbol("hello"), FunctionTemplate::New(Method)->GetFunction());   JSNFC::init(target); } NODE_MODULE(hello, init)

      

    3,binding.gyp

    {
      "targets": [
        {
          "target_name": "hello",
          "sources": [ "hello.cpp" ],
    	'include_dirs': [
                           './include'
    	]
        }
      ]
    }
    

      

    include_dirs是外部库的头文件

    4,mybuild.sh

    node-gyp configure build
    gcc -fexceptions -O2 -o hello.node ./build/Release/obj.target/hello/hello.o ./libmynfclib.a /usr/local/lib/libnfc.a  -shared -fPIC
    

     在当前目录生成了 hello.node 可执行动态库。

    执行node-gyp test.js.


    或者只要在binding.gyp加入一句话:

    {
      "targets": [
        {
          "target_name": "hello",
          "sources": [ "hello.cpp" ],
    	'include_dirs': [
                           './include'
    	],
    	"libraries":["/home/user/workspace/nodejs/libpanda.a", "/usr/local/lib/libnfc.a"]
        }
      ]
    }
    

      


    2.使用动态库,避免两个静态库有redefine。


    1)binding.gyp

    {
      "targets": [
        {
          "target_name": "hello",
          "sources": [ "hello.cpp" ],
    	'include_dirs': [
                           './include'
    	],
    	"libraries":["/home/user/workspace/nodejs/libpanda.a", "/usr/local/lib/libnfc.so","/usr/local/lib/libmpsse.so"],
    	"cflags!":["-fexceptions"]
        }
      ]
    }
    

    2) hello.cpp

     1 #include <node.h>
     2 #include <v8.h>
     3 
     4 #include "NFCInfo.h"
     5 #include "AccelerMeter.h"
     6 
     7 #define WIRING_DEFINE_CONSTANT(NAME, VALUE) (target)->Set( 
     8         v8::String::NewSymbol(NAME), 
     9         v8::Integer::New(VALUE), 
    10         static_cast<v8::PropertyAttribute>(v8::None) 
    11 );
    12 
    13 using namespace v8;
    14 
    15 class JSNFC {
    16 public:
    17     static void init(Handle<Object> target) {
    18         //Here can store target object.
    19     }
    20     
    21     static Handle<Object> readADXL() {
    22         
    23         AccelerMeter am("AccelerMeter");
    24         am.readADXL();
    25         Handle<Object> mpsseObj = Object::New();
    26         mpsseObj->Set(String::NewSymbol("x"), Integer::New(am.x));
    27         mpsseObj->Set(String::NewSymbol("y"), Integer::New(am.y));
    28         mpsseObj->Set(String::NewSymbol("z"), Integer::New(am.z));
    29         
    30         return mpsseObj;
    31     }    
    32 
    33 };
    34 
    35 Handle<Value> sendSmartposter(const Arguments& args) {
    36     HandleScope scope;
    37     
    38     NFCInfo nfc("NFC");    
    39     nfc.writeSmartposter("zhibin", "232323");
    40     bool ret = nfc.send();
    41     return scope.Close(Integer::New((ret?1:0)));
    42 }
    43 
    44 Handle<Value> readADXL(const Arguments& args) {
    45     HandleScope scope;    
    46     ;
    47     return scope.Close(JSNFC::readADXL());
    48 }
    49 
    50 void init(Handle<Object> target) {
    51     target->Set(String::NewSymbol("smartposter"), FunctionTemplate::New(sendSmartposter)->GetFunction());    
    52     target->Set(String::NewSymbol("readADXL"), FunctionTemplate::New(readADXL)->GetFunction());
    53     
    54     JSNFC::init(target);
    55 }
    56 NODE_MODULE(hello, init)

    3) test.js

     1 //var addon = require('./hello');
     2 var addon = require('./build/Release/hello');
     3 
     4 
     5 
     6 var mpsse = addon.readADXL();
     7 
     8 console.log(mpsse.x); 
     9 console.log(mpsse.y); 
    10 console.log(mpsse.z); 
    11 
    12 console.log(addon.smartposter());

    4) 编译运行:

     node-gyp build

    node test.js

  • 相关阅读:
    平时十六测
    平时十五测
    平时十四测
    poj 1486 Sorting Slides
    POJ 3621Sightseeing Cows
    POJ 2728 Desert King
    POJ3111 K Best
    NOIopenjudge 407:Heritage
    POJ#2065. SETI
    HDU 4607 Park Visit
  • 原文地址:https://www.cnblogs.com/bigben0123/p/3780420.html
Copyright © 2011-2022 走看看