`

用ffi调用.dylib库

 
阅读更多

有一个特性需要调用第三方库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绑定.zip

    rust-bindgen, 自动生成 Rust 和 C++ 库的FFI绑定 bindgenimpl period 已经启动 ! 请加入美国 Gitter.im 公司。bindgen 自动生成 Rust 和 C++ 库的FFI绑定。 例如给定了C 头 doggo.h:typedef struct Dog

    rust-bindgen, 自动生成 Rust 和 C 库的FFI绑定.zip

    rust-bindgen, 自动生成 Rust 和 C 库的FFI绑定 bindgenimpl period 已经启动 ! 请加入美国 Gitter.im 公司。bindgen 自动生成 Rust 和 C 库的FFI绑定。 例如给定了C 头 doggo.h:typedef struct Dog

    js_ffi-一个用于调用javascript的FFI库-Rust开发

    js_ffi该库在运行时使用Web程序集在浏览器中创建javascript的桥梁外国函数接口(FFI)库用于在运行时使用Web程序集在浏览器中javascript的桥梁用于从Web Assembly调用许多编程语言的Javascript函数,没有代码生成或...

    FFI.rar

    FFI.rar

    node-ffi是一个Node.js插件用于使用纯JavaScript加载和调用动态库

    node-ffi是一个Node.js插件,用于使用纯JavaScript加载和调用动态库。 它可用于创建原生库的绑定,而无需编写任何C 代码。

    ffi_test.cpp

    ffi_test.cpp

    electron4.2.6编译ffi.doc

    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-ffi 失败的,可以直接把文件拷贝到node-modules下就 可以使用。

    FFI 1.4汉化.rar

    FFI通用脱壳工具的个人汉化修正版。很不错的哟

    dylib.dart:一组帮助解析动态库名称和路径的助手

    dylib 一组帮助解析动态库的名称和路径的助手。用法一个简单的用法示例: import 'package:dylib/dylib....// android: libfoo.so// ios: libfoo.dylib// linux: libfoo.so// macos: libfoo.dylib// windows: foo.dll

    ffi

    使用Dart FFI进行实验 一系列简单的示例演示了如何从Dart调用C库。 请注意,Dart FFI API正在积极开发中,可能会在发布前进行更改。... .dylib文件应在父文件夹中创建。 导航到该文件并运行dart文件。

    FFI脱壳工具.zip

    简单的脱壳工具

    jnr-ffi_2.0.0.jar — JNR-FFI的jar包

    这里有详细的描述 JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi) :http://blog.csdn.net/lanxuezaipiao/article/details/22668459

    开源项目-dyu-ffi-overhead.zip

    开源项目-dyu-ffi-overhead.zip,C FFI overhead in various languages, including Go

    electronjs 安装 ffi-napi 记录.pdf

    electronjs 安装 ffi-napi 记录

    gir_ffi, 在运行时使用 FFI,为基于GObject的库自动生成绑定.zip

    gir_ffi, 在运行时使用 FFI,为基于GObject的库自动生成绑定 GirFFI由 Matijs van Zuijlen描述使用GObject内省存储库的GNOME的ruby 绑定。状态 特性为基于任何gobject的库创建绑定。在运行时生成绑定。为选定方法...

    kdbx.dart:采用纯Dart的KeepassX格式实现

    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/ 视窗: 在...

    php-ffi-go-example:通过FFI从PHP调用GO函数

    刚刚尝试通过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-ffi:Deno外功能接口

    地衣Deno外功能接口 deno-ffi是一个Deno插件,用于使用纯TypeScript加载和调用动态库。 它可以用于创建与本机库的绑定,而无需编写任何C ++代码。 它也简化了C语言对Deno的扩充,因为它可以处理TypeScript和C之间...

    Python3字符串encode与decode的讲解

    二进制数据使用byte类型表示,所以不会将str和byte混在一起。在实际应用中我们经常需要将两者进行互转 有几点需要注意: 1:字符串通过编码转换为字节码,字节码通过解码转换为字符串 str—>(encode)—>bytes,...

Global site tag (gtag.js) - Google Analytics