使用C语言开发去素数的nodejs插件,c语言代码如下
#include <node.h>
#include <stdlib.h>
namespace Prime {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
using v8::Exception;
using v8::Number;
// void Method(const FunctionCallbackInfo<Value>& args) {
// Isolate* isolate = args.GetIsolate();
// args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
// }
void Prime(const FunctionCallbackInfo<Value>& args){
Isolate* isolate = args.GetIsolate();
int i,j,a,b;
//int result[2];
// 检查传入的参数的个数
if (args.Length() < 1) {
// 抛出一个错误并传回到 JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "参数的数量错误")));
return;
}
// 检查参数的类型
if (!args[0]->IsNumber()) {
isolate->ThrowException(Exception::TypeError(String::NewFromUtf8(isolate, "参数错误")));
return;
}
//创建一个对象,用于存储素数
Local<Object> obj = Object::New(isolate);
a=0;
b=0;
//求素数
for(i=2;i<=args[0]->NumberValue();i++) {
for(j=2;j<i;j++) {
if(i%j==0)
a++;
}
if(a<1) {
obj->Set(Number::New(isolate, b), Number::New(isolate, i));
b++;
a=0;
} else
a=0;
}
args.GetReturnValue().Set(obj);
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "prime", Prime);
}
NODE_MODULE(addon, init)
} // namespace demo
安装node-gyp
npm install -g node-gyp
创建node-gyp的软连接
ln -s /usr/local/node/bin/node-gyp /usr/bin
创建binding.gyp
{
"targets": [
{
"target_name": "addon",
"sources": [ "hello.cc" ]
}
]
}
编译编写的c语言
node-gyp configure
执行后生成build文件夹
node-gyp build
目录结构如下
build
├── addon.target.mk
├── binding.Makefile
├── config.gypi
├── Makefile
└── Release
├── addon.node
└── obj.target
├── addon
│ └── hello.o
└── addon.node
编译完成,编写测试的index.js
const addon = require('./build/Release/addon');
console.log(addon.prime(200));
node index.js
执行结果如下:
{ '0': 2,
'1': 3,
'2': 5,
'3': 7,
'4': 11,
'5': 13,
'6': 17,
'7': 19,
'8': 23,
'9': 29,
'10': 31,
'11': 37,
'12': 41,
'13': 43,
'14': 47,
'15': 53,
'16': 59,
'17': 61,
'18': 67,
'19': 71,
'20': 73,
'21': 79,
'22': 83,
'23': 89,
'24': 97,
'25': 101,
'26': 103,
'27': 107,
'28': 109,
'29': 113,
'30': 127,
'31': 131,
'32': 137,
'33': 139,
'34': 149,
'35': 151,
'36': 157,
'37': 163,
'38': 167,
'39': 173,
'40': 179,
'41': 181,
'42': 191,
'43': 193,
'44': 197,
'45': 199 }