有一个特性需要调用第三方库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
});
分享到:
相关推荐
rust-bindgen, 自动生成 Rust 和 C++ 库的FFI绑定 bindgenimpl period 已经启动 ! 请加入美国 Gitter.im 公司。bindgen 自动生成 Rust 和 C++ 库的FFI绑定。 例如给定了C 头 doggo.h:typedef struct Dog
rust-bindgen, 自动生成 Rust 和 C 库的FFI绑定 bindgenimpl period 已经启动 ! 请加入美国 Gitter.im 公司。bindgen 自动生成 Rust 和 C 库的FFI绑定。 例如给定了C 头 doggo.h:typedef struct Dog
js_ffi该库在运行时使用Web程序集在浏览器中创建javascript的桥梁外国函数接口(FFI)库用于在运行时使用Web程序集在浏览器中javascript的桥梁用于从Web Assembly调用许多编程语言的Javascript函数,没有代码生成或...
FFI.rar
node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库。 它可用于创建原生库的绑定,而无需编写任何C 代码。
ffi_test.cpp
Electron4.2.6 硬件调用环境以及演示 第一步 配置环境 python2.7.0,vs2015,node32位,全局安装 node-gyp,命令:npm install node-gyp -g 第二步 下载安装编译ffi并编译成node模块,npm install ffi -s。下载ffi...
node-ffi 的下载包,如果安装node-ffi 失败的,可以直接把文件拷贝到node-modules下就 可以使用。
FFI通用脱壳工具的个人汉化修正版。很不错的哟
dylib 一组帮助解析动态库的名称和路径的助手。用法一个简单的用法示例: import 'package:dylib/dylib....// android: libfoo.so// ios: libfoo.dylib// linux: libfoo.so// macos: libfoo.dylib// windows: foo.dll
使用Dart FFI进行实验 一系列简单的示例演示了如何从Dart调用C库。 请注意,Dart FFI API正在积极开发中,可能会在发布前进行更改。... .dylib文件应在父文件夹中创建。 导航到该文件并运行dart文件。
简单的脱壳工具
这里有详细的描述 JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi) :http://blog.csdn.net/lanxuezaipiao/article/details/22668459
开源项目-dyu-ffi-overhead.zip,C FFI overhead in various languages, including Go
electronjs 安装 ffi-napi 记录
gir_ffi, 在运行时使用 FFI,为基于GObject的库自动生成绑定 GirFFI由 Matijs van Zuijlen描述使用GObject内省存储库的GNOME的ruby 绑定。状态 特性为基于任何gobject的库创建绑定。在运行时生成绑定。为选定方法...
cp libargon2_ffi.dylib kdbx.dart/ 可能需要运行: codesign --remove-signature /usr/local/bin/dart Linux: argon2_ffi / ios /类 cmake . && cmake --build . cp libargon2_ffi.so kdbx.dart/ 视窗: 在...
刚刚尝试通过FFI从PHP调用GO函数。 怎么跑? 确保在php.ini具有PHP 7.4和ffi.enable=true 。 克隆此存储库。 git clone https://github.com/eislambey/php-ffi-go-example.git 编译libutil.so go build -o ...
地衣Deno外功能接口 deno-ffi是一个Deno插件,用于使用纯TypeScript加载和调用动态库。 它可以用于创建与本机库的绑定,而无需编写任何C ++代码。 它也简化了C语言对Deno的扩充,因为它可以处理TypeScript和C之间...
二进制数据使用byte类型表示,所以不会将str和byte混在一起。在实际应用中我们经常需要将两者进行互转 有几点需要注意: 1:字符串通过编码转换为字节码,字节码通过解码转换为字符串 str—>(encode)—>bytes,...