electron调用C++动态链接库

1、实验环境

2、centOS下安装nodejs

下载已经编译好的node.js

wget http://nodejs.org/dist/latest-v5.x/node-v5.7.1-linux-x64.tar.gz

tar zxvf node-v5.7.1-linux-x64.tar.gz

mv node-v5.7.1-linux-x64/usr/local/node

配置NODE_HOME,进入profile编辑环境变量

vim /etc/profile

#set for nodejs

export NODE_HOME=/usr/local/node

export PATH=$NODE_HOME/bin:$PATH

:wq保存并退出,编译/etc/profile使配置生效

source /etc/profile

验证是否安装配置成功

node -v

输出 v5.7.1表示配置成功

npm模块安装路径

/usr/local/node/bin/npm

3、安装electron

# mkdir /usr/local/electron

# cd /usr/local/electron

# wget https://npm.taobao.org/mirrors/electron/0.36.9/electron-v0.36.9-linux-x64.zip

# unzipelectron-v0.36.9-linux-x64.zip

# vim /etc/profile

export ELECTRON=/usr/local/electron

export PATH=$ELECTRON:$PATH

# source /etc/profile

4、编写node.js调用C/C++例子

从一个简单的例子开始,说明JavaScript调用C/C++的流程。示例函数包含3部分:配置文件、js文件、cc文件

mkdir /root/test

cd /root/test

4.1、配置文件

binding.gyp(一定要叫这个名字)

简单的配置如下:

{

"targets": [

{

"target_name": "test",

"sources":[ "test.cc" ]

}

]

}

4.2、js文件

test.js,hello接受两个参数,一个字符串,一个回调函数:

var test = require(‘./build/Release/test‘);

test.hello(‘test‘, function(data) {

console.log(data);

});

4.3、cc文件

test.cc,文件应用两个头部node.h和v8.h,整体结构和node的module非常相似,都是先定义Function/Object,然后export:

#include <node.h>

#include <v8.h>

using namespace v8;

// 传入了两个参数,args[0]字符串,args[1] 回调函数

void hello(const FunctionCallbackInfo<Value>& args) {

// 使用 HandleScope 来管理生命周期

Isolate* isolate =Isolate::GetCurrent();

HandleScopescope(isolate);

// 判断参数格式和格式

if (args.Length() < 2|| !args[0]->IsString()) {

isolate->ThrowException(Exception::TypeError(

String::NewFromUtf8(isolate, "Wrong arguments")));

return;

}

// callback, 使用Cast方法来转换

Local<Function>callback = Local<Function>::Cast(args[1]);

Local<Value>argv[1] = {

// 拼接String

String::Concat(Local<String>::Cast(args[0]),String::NewFromUtf8(isolate, " apexsoft"))

};

// 调用回调, 参数: 当前上下文,参数个数,参数列表

callback->Call(isolate->GetCurrentContext()->Global(), 1,argv);

}

// 相当于在 exports 对象中添加 { hello: hello }

void init(Handle<Object> exports) {

NODE_SET_METHOD(exports,"hello", hello);

}

// 将 export 对象暴露出去

// 原型`NODE_MODULE(module_name, Initialize)`

NODE_MODULE(test, init);

4.4、编译和使用

安装node-gyp

npm install node-gyp -g

在项目根目录下使用:

node-gyp configure

node-gyp build

5、让Electron去识别C/C++

5.1、修改test.js

vim test.js

varhttp = require("http");

http.createServer(function(req,res) {

res.writeHead( 200 ,{"Content-Type":"text/html"});

var test = require(‘./build/Release/test‘);

var data01;

test.hello(‘hello‘, function(data) {

data01=data;

});

res.write(data01);

res.end("<p>apexsoft.com.cn</p>");

}).listen(3000);

console.log("HTTP server is listening at port 3000.");

5.2、main.js

vim main.js

‘use strict‘;

const electron = require(‘electron‘);

// Module to control application life.

const app = electron.app;

// Module to create native browser window.

const BrowserWindow = electron.BrowserWindow;

// Keep a global reference of the window object, if you don‘t,the window will

// be closed automatically when the JavaScript object is garbagecollected.

let mainWindow;

function createWindow () {

// Create the browserwindow.

mainWindow = newBrowserWindow({width: 800, height: 600});

// and load theindex.html of the app.

//mainWindow.loadURL(‘file://‘ + __dirname + ‘/index.html‘);

mainWindow.loadURL("http:192.168.1.172:3000");

// Open the DevTools.

mainWindow.webContents.openDevTools();

// Emitted when thewindow is closed.

mainWindow.on(‘closed‘,function() {

// Dereference thewindow object, usually you would store windows

// in an array if yourapp supports multi windows, this is the time

// when you shoulddelete the corresponding element.

mainWindow = null;

});

}

// This method will be called when Electron has finished

// initialization and is ready to create browser windows.

app.on(‘ready‘, createWindow);

// Quit when all windows are closed.

app.on(‘window-all-closed‘, function () {

// On OS X it is commonfor applications and their menu bar

// to stay active untilthe user quits explicitly with Cmd + Q

if (process.platform !==‘darwin‘) {

app.quit();

}

});

app.on(‘activate‘, function () {

// On OS X it‘s commonto re-create a window in the app when the

// dock icon is clickedand there are no other windows open.

if (mainWindow === null){

createWindow();

}

});

5.3、package.json

vim package.json

{

"name":"electron-quick-start",

"version": "1.0.0",

"description": "A minimalElectron application",

"main": "main.js",

"scripts": {

"start": "electronmain.js"

},

"repository": {

"type": "git",

"url":"git+https://github.com/atom/electron-quick-start.git"

},

"keywords": [

"Electron",

"quick",

"start",

"tutorial"

],

"author": "GitHub",

"license": "CC0-1.0",

"bugs": {

"url": "https://github.com/atom/electron-quick-start/issues"

},

"homepage":"https://github.com/atom/electron-quick-start#readme",

"devDependencies": {

"electron-prebuilt":"^0.36.0"

}

}

6、使用方法

窗口一:启动test.js

node test.js

窗口二:启动electron

electron /root/test

运行效果

7、打包

使用命令完成打包工具命令行的安装

npm install -g asar

打包你的工程目录

asar pack test test.asar

生成app.asar。在windows下,可以将app.asar直接拉入electron.exe下就可以用了。

时间: 2024-10-29 04:47:52

electron调用C++动态链接库的相关文章

MyElipse6.5环境下java调用vs2010动态链接库DLL人脸检测

Java调用C++动态链接库的网络上的文章也很多,但是还是有个别的问题没有提到,导致操作起来还是难度较大,关键是程序的疑难杂症不好治. 准备工具:vs2010,java1.6,MyElipse6.5,opencv2.4.6(其他版本请留意程序中的版本号),摄像头. 操作流程,流水式操作: 1.先建立文件FaceDetect.java文件并通过指令生成.h头文件 FaceDetect.java的代码: public class FaceDetect { static { System.loadLi

VC++:创建,调用Win32动态链接库

VC++:创建,调用Win32动态链接库 概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类.仓库的发展史经历了"无库" ---> "静态链接库"  ---> "动态链接库".静态链接库与动态链接库都能实现共享代码,如果使用静态链接库,编译后lib中的指令会被包含在生成的EXE文件中,如果使用动态链接库,则不会被包含到EXE文件中,EXE文件执行

JAVA使用JNI调用C++动态链接库

JAVA使用JNI调用C++动态链接库 使用JNI连接DLL动态链接库,并调用其中的函数 首先 C++中写好相关函数,文件名为test.cpp,使用g++编译为DLL文件,指令如下: g++ -shared -Wl,--kill-at,--output-def,test.def -o test.dll test.cpp #如果cpp中要调用其他dll,需要在命令后面添加相关lib描述 这样就在当路径下同时生成了test.def 和 test.dll 文件 顺便说一下,.lib文件可以通过.def

electron调用c#动态库

electron调用c#动态库 新建C#动态库 方法要以异步任务的方式,可以直接包装,也可以写成天然异步 代码如下 public class Class1 { public async Task<Object> Invoke(object input) { return Helper.SayHi("Invoke1:" + (string)input); } public async Task<Object> Invoke2(object input) { ret

electron 使用 node-ffi 调用 C++ 动态链接库(DLL)

一.为什么需要使用DLL 需要使用系统 API 操作或扩展应用程序: 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的: 需要调用C++实现的一些复杂算法等. 二.node-ffi 是什么 node-ffi:Node.js Foreign Function Interface node-ffi is a Node.js addon for loading and calling dynamic libraries usi

VBA 调用DLL动态链接库

在ArcMap中引用动态链接库       我在VB6下编译生成了一个动态链接库文件VBAPrj.dll,其中有一类模块VBACls,此类模块有一个方法Test(Doc As Object).        常见的方法有三种(作者:张业新): 1.打开VBA编辑器,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库.        调用代码如下:          Dim VBACls As New VBAPrj.VBACls          VBAC

[转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不能完成我们所有的工作.在很多工程计算中,C#语言的计算速度,精度,以及执行效率相对来说都达不到项目的要求.因此我们便考虑是否有一种方式将我们的工程计算部分和我们的项目分开,将计算部分用另一种执行更快,精度更高的语言来编写,然后在C#中调用,最后完成我们的工作.答案是肯定的. Fortran是一门古老

Windows下C语言调用dll动态链接库

dll是windows下的动态链接库文件,下面记录一下在windows下如何调用C语言开发的dll动态链接库. 1.dll动态链接库的源代码 hello_dll.c #include "stdio.h" _declspec(dllexport) void test_print(char const *str) { printf("%s\n", str); } _declspec(dllexport) int test_add(int a, int b) { retu

VS2015环境下生成和调用DLL动态链接库

一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_generate->确定 2.出现Win32应用程序向导->下一步->在"应用程序类型"中选择"DLL"->在"附加选项"中选择"空项目"->完成 3.视图->解决方案管理器->右键"