sun博客

记录点滴!

//testAdd.cpp
#include <iostream>
using namespace std;
extern "C"
int add(int a,int b){
    return a+b;
    cout<<"val"<<a+b;
};

g++ -fPIC -shared -o testAdd.dll testAdd.cpp (有无-fPIC都可以运行成功,看来函数也不需要是导出函数),生成dll文件

npm install ffi-napi,安装 ffi-napi ,

//nodejs 
var ffi = require('ffi-napi');

let pa="D:\\project\\c\\test3\\testAdd.dll"
var libm = ffi.Library(pa, {
    'add': [ 'int', [ 'int','int' ] ]
});
//g++ -fPIC -shared -o testAdd.dll testAdd.cpp (有无-fPIC都可以运行成功,看来函数也不需要是导出函数)
console.log(libm.add(1,2)) //输出3

原来是想测试非导出函数是否是可以nodejs调用的,但没有办法,不加extern “C”找不到add函数,加上“ __declspec(dllexport) ”也找不到,仍旧报Dynamic Symbol Retrieval Error: Win32 error 127错误。

加了extern “C”却隐式的将add函数变成了导出函数。使用ida找开,在exports里面有add函数。

原因是使用 extern “C” 修饰的函数会被编译器视为导出函数,这意味着其他代码可以通过函数名来引用和调用该函数。这在与其他语言进行交互时非常有用,因为其他语言通常无法直接调用C++的函数。

结论,其实想下就知道,要想在nodejs 中使用c/c++的代码,一定要是导出函数才行。因为c/c++不同页面中使用都要设置为导出函数,何况跨平台呢。

在window平台上要使用dll文件。使用android studio 生成的so文件,即便是x86-64位的so,也仍旧报“Dynamic Symbol Retrieval Error: Win32 error 126”的错。原因在于so文件是给linux用的, android studio 生成x86-64的so,也是给64位电脑的cpu上安装的linux系统用的。所以不行。

所以,如果是想用nodejs加载其它app的so,首先要在linux平台。要想用nodejs调用,估计也就只能使用unicorn呢。接下来研究使用unicron在nodejs中调用其它app的算法。

Windows上的Node.js确实无法直接加载Linux上的.so文件,因为.so文件是Linux系统上的共享对象文件。在Windows上,可以加载.dll文件作为扩展模块。

如果您想在Windows上使用一个.so文件,您有几个选择:

  1. 尝试在Windows上找到相应的.dll文件。有时,相同的功能库可能会提供Windows版本的.dll文件。您可以尝试查找并使用这些文件。
  2. 如果您有Linux系统,您可以尝试在Linux上编译.so文件的源代码,并将生成的.dll文件复制到Windows上使用。
  3. 使用跨平台的库,例如libuv。这是一个跨平台的异步I/O库,Node.js使用它作为其底层库。通过使用libuv,您可以编写可在Windows和Linux上运行的代码,而无需担心.so和.dll文件的问题。

希望这些信息对您有所帮助!

https://www.npmjs.com/package/ffi-napi

错误原因:

http://www.voycn.com/article/jsdiaoyongcdongtaikudllzuijiandemohewentijijinshoucangban

发表评论

邮箱地址不会被公开。 必填项已用*标注