• idea javaweb-jsp项目出现 Cannot resolve directory ‘error‘


    • Native Abstractions for Node.js (nan)
    • nan方式的好处:使用nan方式,编写的c++插件接口,会自动兼容不同版本的nodejs
    • 因此,你的代码只需要随着 nan版本升级出现的改变而改变,至于Nodejs,nan会帮你兼容(前提是nan支持该版本的nodejs)

    1、先安装node.js和python

    2、新建一个demo项目: 创建demo目录,并进入其中,然后运行下面命令。

    1. mkdir demo
    2. cd demo
    3. npm init

    运行npm init时,之后会生成一个package.json(具体内容与输入参数有关):

    1. {
    2. "name": "demo",
    3. "version": "1.0.0",
    4. "description": "a demo for node call native functions",
    5. "main": "demo.js",
    6. "scripts": {
    7. "test": "echo \"Error: no test specified\" && exit 1"
    8. },
    9. "keywords": [
    10. "node"
    11. ],
    12. "author": "Li XianJing",
    13. "license": "ISC"
    14. }

    3、在项目路径下

    1. npm install -g node-gyp (全局安装)
    2. npm install nan 这个也可以用 npm install nan bindings --save
    3. 解释
    4. node-gyp是C++扩展的编译工具;
    5. nan和bindings包含了C++扩展需要的头文件;

    4、用C++编写原生代码( 为了让目录结构整洁一点,我们把代码放到native只目录下)。

    下面的文件(native/demo.cc),添加一个Add方法,计算两个数之和:

    1. #include <nan.h>
    2. void Add(const Nan::FunctionCallbackInfo<v8::Value>& info) {
    3. if (info.Length() < 2) {
    4. Nan::ThrowTypeError("Wrong number of arguments");
    5. return;
    6. }
    7. if (!info[0]->IsNumber() || !info[1]->IsNumber()) {
    8. Nan::ThrowTypeError("Wrong arguments");
    9. return;
    10. }
    11. double arg0 = info[0]->NumberValue();
    12. double arg1 = info[1]->NumberValue();
    13. v8::Local<v8::Number> num = Nan::New(arg0 + arg1);
    14. info.GetReturnValue().Set(num);
    15. }
    16. void Init(v8::Local<v8::Object> exports) {
    17. exports->Set(Nan::New("add").ToLocalChecked(),
    18. Nan::New<v8::FunctionTemplate>(Add)->GetFunction());
    19. }
    20. NODE_MODULE(demo, Init)

    5、写一个node-gyp的配置文件(文件名固定为binding.gyp),用来编译C++代码。

    1. {
    2. "targets": [
    3. {
    4. "target_name": "demo",
    5. "sources": [ "native/demo.cc" ],
    6. "include_dirs": [
    7. "\"require('nan')\")"
    8. ]
    9. }
    10. ]
    11. }

    6、编写一个JS文件(demo.js)),让它调用原生代码。

    1. var demo = require('bindings')('demo.node')
    2. console.log('add(3, 5) => ', demo.add(3, 5))

    7、运行配置脚本(如果没有增删文件,不需要每次运行)

    node-gyp configure

    8、编译C++程序。

    1. node-gyp build
    2. 注意:有修改的时候最好用:node-gyp rebuild

    9、运行JS代码,看看是否工作。

    node demo.js

    其他参考:

    1. addon其实就是一个桥梁,利用V8提供的API,可以实现JavaScript和C++的互相调用,打通JavaScript和C++之间的接口。
    2. 我们先编写一个小例子,大概了解js层和addon之间数据交换的过程。需要三个文件:
    3. binding.gyp:其实就是一个json文件,因为要使用node-gyp进行编译,该文件可以说是定义了一些编译规则。
    4. addon.cc: 该文件就是我们需要编写的addon,node-gyp借助vs编译后最终会生成
    5. addon.node二进制文件。
    6. index.js: 该文件就是测试js,在js层可以加载addon,调用addon对外的函数。
    1. void Foo(const v8::FunctionCallbackInfo<v8::Value> &args)
    2. {
    3. // from v8 to cpp
    4. v8::Isolate* isolate = args.GetIsolate();
    5. v8::String::Utf8Value str(isolate, args[0]);
    6. std::string cppStr(*str);
    7. // back to v8
    8. v8::Local<v8::String> v8String = v8::String::NewFromUtf8(isolate, cppStr.c_str(), v8::String::kNormalString);
    9. }
    1. 1. npm 安装windows-build-tools
    2. cmd管理员模式打开,执行下面命令:
    3. npm install --global --production windows-build-tools
    4. 等待执行完成,重启CMD
    5. 2. windows下安装node-gyp
    6. node-gyp就是为node编译c++扩展的时候使用的编译工具。
    7. 安装方法:
    8. npm install -g node-gyp
    9. 3. 配置依赖
    10. npm config set python python2.7
    11. npm config set msvs_version 2015
    12. 如果不出意外的话我们就可以用node-gyp进行构建了。
    13. 如果出现问题可以参考node-gyp的github主页。
    1. #include <nan.h>
    2. NAN_METHOD(multi)
    3. {
    4. int result = 1;
    5. for (int i = 0; i < info.Length(); i++)
    6. {
    7. result *= info[i]->NumberValue();
    8. }
    9. info.GetReturnValue().Set(Nan::New(result));
    10. }
    11. NAN_METHOD(add)
    12. {
    13. int result = 0;
    14. for (int i = 0; i < info.Length(); i++)
    15. {
    16. result += info[i]->NumberValue();
    17. }
    18. info.GetReturnValue().Set(Nan::New(result));
    19. }
    20. void init(v8::Local<v8::Object> exports)
    21. {
    22. Nan::SetMethod(exports, "multi", multi);
    23. Nan::SetMethod(exports, "add", add);
    24. }
    25. NODE_MODULE(demo, init); // demo-导出模块的名称

  • 相关阅读:
    如何获取微信的版本号详解【附完整源码】
    创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究
    python提取网页指定内容
    flutter3-weos手机OS系统|Flutter3.22+Getx仿ios桌面管理OA应用
    偶现bug如何分析和处理?
    ubuntu bind9 主从配置
    Netty(11)序列化/反序列化、Netty参数
    cadence SPB17.4 - allegro - DRC ERROR - Soldermask to Shape Spacing
    【Lilishop商城】No2-7.确定软件架构搭建六(本篇包括延时任务,会用到rocketmq、redis)
    Spring Boot Actuator 介绍
  • 原文地址:https://blog.csdn.net/technologyleader/article/details/126488712