有一个特性需要调用第三方库libsync,在node.js里可以用ffi来实现
首先稍微包装了一下,ffi也是支持异步调用的,但是API比较麻烦,包装以后调用起来会比较容易
var ffi = require("ffi");
var lib = ffi.Library('./libsync', {
'file_chunk': ['int', ['string', 'string', 'int']],
'file_delta': ['int', ['string', 'string', 'string', 'int']],
'file_sync': ['int', ['string', 'string']]
});
exports.file_chunk = file_chunk;
exports.file_delta = file_delta;
exports.file_sync = file_sync;
// callback(err, result)
function file_chunk(src, chunk, algo, callback){
lib.file_chunk.async(src, chunk, algo, callback);
}
function file_delta(src, chunk, delta, algo, callback){
lib.file_delta.async(src, chunk, delta, algo, callback);
}
function file_sync(src, delta, callback){
lib.file_sync.async(src, delta, callback);
}
libsync就是依赖的动态链接库,在linux下是.so文件,而在Mac下是.dylib文件,ffi会根据当前的平台,自动查找合适的后缀:
/**
* The extension to use on libraries.
* i.e. libm -> libm.so on linux
*/
var EXT = Library.EXT = {
'linux': '.so'
, 'linux2': '.so'
, 'sunos': '.so'
, 'solaris':'.so'
, 'freebsd':'.so'
, 'openbsd':'.so'
, 'darwin': '.dylib'
, 'mac': '.dylib'
, 'win32': '.dll'
}[process.platform]
所以接下来就是需要把源代码.c,.h编译成.so和.dylib库(开发需要.dylib,生产环境需要.so)
mac下编译dylib文件的命令也很简单:
gcc -dynamiclib -o c.dylib a.c b.c
实际调用的代码:
libsync.file_chunk(localPath, chunkPath, 0, function (err, flag) {
// logic
});
分享到:
相关推荐
ffi`(Node.js Foreign Function Interface)是一个非常重要的库,它为开发者提供了一种能力,即在不编写任何C/C++代码的情况下,能够直接在Node.js应用中调用操作系统级别的动态链接库(DLLs on Windows, .so on Linux...
通过FFI调用C或Fortran库,可以提升性能。 3. 操作系统交互:操作系统API通常是C语言实现的,FFI可以帮助非C语言与操作系统进行交互,比如文件操作、网络通信等。 4. 跨语言协作:在多语言项目中,FFI可以作为不同...
1. **库加载**:使用 `ffi.Library` 加载本地动态链接库(如 `.dll` for Windows, `.so` for Linux, `.dylib` for macOS)。你需要提供库的路径和一个包含要调用的函数名和参数类型的对象。 2. **类型定义**:`ffi`...
对于调用 C 动态库(`.so`、`.dll` 或 `.dylib`),Rust 会使用 `std::os::raw` 模块中的类型作为 C 类型的绑定,而 `std::ffi::cdll` 或 `std::sys::windows::dynamic_library::DynamicLibrary` 可用于加载库。...
总之,`allocation.dart`文件是Flutter应用与C语言交互的一个实例,展示了如何使用Flutter的FFI机制调用C函数。在实际项目中,这种混合编程能力可以让我们充分利用两种语言的优点,为复杂的应用场景提供解决方案。
一系列简单的示例演示了如何从Dart调用C库。 请注意,Dart FFI API正在积极开发中,可能会在发布前进行更改。 该代码旨在与Dart版本2.5.0-dev.1.0一起使用。 指示 (当前)已将C make文件编写为在Mac上可以使用。 ...
地衣Deno外功能接口 deno-ffi是一个Deno插件,用于使用纯TypeScript加载和调用动态库。 它可以用于创建与本机库的绑定,而无需编写任何C ++代码。 它也简化了C语言对Deno的扩充,因为它可以处理TypeScript和C之间...
Rust可以通过`cargo build --crate-type=cdylib`生成动态库(`.dll`/`.so`/`.dylib`),或通过`--crate-type=staticlib`生成静态库。选择哪种取决于你的需求,静态库通常更易于分发,但可能带来链接时的大小问题。 ...
Rust支持通过生成二进制库进行FFI调用,主要有以下几种库类型: - `lib`:由编译器首选的库类型,默认为rlib。 - `rlib`:Rust静态库。 - `staticlib`:原生静态库。 - `dylib`:Rust动态库。 - `cdylib`:原生动态...
首先,Flutter本身是用Dart语言编写的,它通过dart:ffi(Foreign Function Interface)库提供了与C语言交互的能力。Dart的ffi使得我们能够在Flutter中调用C语言编译的动态链接库(DLL或.so文件),进而实现了Flutter...
总结来说,通过这个过程,我们了解了如何使用C++编写Node.js的扩展,并通过node-ffi库实现了JavaScript调用C++原生函数的功能。这种方法对于那些需要高性能计算或者利用现有C/C++库的Node.js应用特别有用。不过,...
然而,由于脚本语言在性能上可能不如系统级语言,因此在需要高性能计算或者内存管理严格的情况下,可以使用Rust作为后端,通过FFI调用Rust编译的库。 在"FFI-Platypus-Lang-Rust"项目中,Rust编写的库可以提供复杂...
`mlpack` 是一个用 C++ 编写的开源机器学习库,设计目的是快速、灵活且易于使用。它提供了多种机器学习算法,包括但不限于:回归、分类、聚类、降维和强化学习。mlpack 的设计目标是使用户能够快速地进行实验和原型...
4. **加载和调用C++库**:在Flutter应用启动时加载动态链接库(`.so`或`.dylib`),然后通过dart:ffi调用C++函数。 通过以上步骤,开发者可以充分利用flutter_cpp_lib提供的C++功能,提升Flutter应用的功能性和性能...
任何使用mexFunction符号和正确的文件扩展名与libmex或liboctave链接的共享对象库都可以作为 mex 函数调用。 对于这个 rust/mex 示例,我们只需创建一个 rust dylib 并将我们想要从 MATLAB/Octave 调用的 rust 代码...