首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过ffiNode.js中调用动态链接(.so.dll文件)

作者:link [img594ca61c8d41d.jpg] 概述 为什么要在node.js中调用动态链接 由于腾讯体系下许多公共后台服务(L5, CKV, msgQ等)已经有了非常成熟C.../C++编写API,以供应用程序调用,node.js作为在公司内新兴后台runtime在调用这些公共服务时候没必要再造一遍轮子,而是可以将这些API编译成.so文件直接使用。...对于一些密集计算型任务可以由C++编写好模块,生成.so文件后由node.js调用。 ffi简介与安装 我们使用node-ffi来帮助我们调用动态链接。...并且,如果你使用node.js版本是4.0+,node-gyp安装依赖支持C++11语法gcc,你需要确定当前环境gcc版本至少高于4.8。...下面是如果利用ffi在nodejs中调用这个接口,该接口源码已经被封装成libsend_msg.so这个动态链接了,我们直接调用就好。

6.2K02

通过ffinode.js中调用动态链接(.so.dll文件)

概述 为什么要在node.js中调用动态链接 由于腾讯体系下许多公共后台服务(L5, CKV, msgQ等)已经有了非常成熟C/C++编写API,以供应用程序调用,node.js作为在公司内新兴后台...对于一些密集计算型任务可以由C++编写好模块,生成.so文件后由node.js调用。 ffi简介与安装 我们使用node-ffi来帮助我们调用动态链接。...并且,如果你使用node.js版本是4.0+,node-gyp安装依赖支持C++11语法gcc,你需要确定当前环境gcc版本至少高于4.8。...ldconfig命令主要用途是在默认搜寻目录(/lib和/usr/lib)以及动态配置文件/etc/ld.so.conf内所列目录下,搜索出可共享动态链接(格式如lib.so),进而创建出动态装入程序...下面是如果利用ffi在nodejs中调用这个接口,该接口源码已经被封装成libsend_msg.so这个动态链接了,我们直接调用就好。

6K70
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    通过ffinode.js中调用动态链接(.so.dll文件)

    本文作者:IMWeb link 原文出处:IMWeb社区 未经同意,禁止转载 概述 为什么要在node.js中调用动态链接 由于腾讯体系下许多公共后台服务(L5, CKV, msgQ等...)已经有了非常成熟C/C++编写API,以供应用程序调用,node.js作为在公司内新兴后台runtime在调用这些公共服务时候没必要再造一遍轮子,而是可以将这些API编译成.so文件直接使用。...对于一些密集计算型任务可以由C++编写好模块,生成.so文件后由node.js调用。 ffi简介与安装 我们使用node-ffi来帮助我们调用动态链接。...并且,如果你使用node.js版本是4.0+,node-gyp安装依赖支持C++11语法gcc,你需要确定当前环境gcc版本至少高于4.8。...下面是如果利用ffi在nodejs中调用这个接口,该接口源码已经被封装成libsend_msg.so这个动态链接了,我们直接调用就好。

    6.4K10

    从 RUST 中公开 FFI

    FFI 可用于加快程序执行(这在 Python 或 Ruby 这类动态语言中很常见),或者只是因为你想使用一些其他语言编写(例如 TensorFlow 核心是用 C++ 写,并暴露了 C API...为 Rust 编写 FFI 并不难,但是却有一些挑战和可怕部分,主要是你要使用指针和 unsafe 块1。...在这篇文章中,我将讲述我对 Rust 和 FFI 经验,基于 battery-ffi ,它将 FFI 暴露给我另一个 crate — battery。...[dependencies] libc = "*" [lib] crate-type = ["cdylib"] 将 FFI 层与 “主” 分离出来,并将不安全代码转移到一个新 crate,这可能是一个好主意...另外,默认情况下 Rust 使用 crate-type = ["rlib"],而 FFI 因该是 cdylib。

    1.9K30

    Rust FFI 编程 - Rust 语言层面对 FFI 支持

    Rust 语言对 FFI 有比较完善支持。本节主要讲在基础设施层面,Rust 语言对 FFI 支持。...标准 std:os:raw 模块 std:ffi 模块 1....标准 在实际开发 Rust 语言与其它语言相互调用程序时,会遇到需要相互传递参数情况。Rust 标准std::os::raw 和std::ffi 这两个模块提供了这方面的支持。...2.1 std::os::raw 模块 使用 FFI 进行交互代码通常会使用到 C 语言提供基本类型,标准 std::os::raw 模块[2]提供了一些类型与 C 语言定义类型相匹配,以便与...2.2 标准 std::ffi 模块 由于 Rust 语言中字符串与 C 语言字符串不同之处,标准 std::ffi 模块[3]提供了一组实用程序,主要用于外部函数接口 FFI 绑定,以及用在与其他语言传递类

    3.2K10

    Rust FFI 编程 - Rust导出共享04

    这节我们主要关注 Rust 导出共享错误处理。...Option 和 Result 处理 在 FFI 中允许使用任何T: SizedOption和Option,代替显式地进行无效性(nullity )检查指针。...在设计 Rust 导出共享时,我们可以使用返回值错误处理机制,使 C 调用者可以通过检查返回值来检测何时发生了错误,并获得相关错误信息。...同时跨越 FFI 边界panic会导致未定义行为(Undefined Behavior,UB),我们还需要确保我们 FFI 绑定是异常安全(Exception Safety)。...也就是说如果 Rust 导出库代码可能会出现panic,则需要有个处理机制。在 FFI 绑定时我们可以使用catch_unwind将其包含在 Rust 中,从而不跨越 FFI 边界。

    59110

    Rust FFI 编程 - Rust导出共享02

    这一篇我们来探讨Rust导出共享时如何传递字符串,主要涉及字符串作为函数参数和函数返回值处理细节。...我们首先回顾关于字符串基础知识,了解其在Rust和C中区别,然后设计具体示例进行实践,并整理出传递字符串FFI编程范式。 基础知识 在 C 语言中,字符串可看作是由字符组成一维字节数组。...出于内存安全考虑,字符串被分为了很多种类型来表示,我们来看一张图。 ? 我们简单介绍以下几个类型,其余类型可以看 Rust 标准文档。...str:这是 Rust 语言核心中仅有的一种字符串类型,Rust 标准中提供了其它字符串类型。...在 Rust 标准中提供了对字符串按字符处理(chars())和按字节(bytes())处理操作支持,其中单个字符是用char类型来表示,而使用u8来表示字节类型。

    1K20

    Rust FFI 编程 - Rust导出共享05

    本章,我们继续来玩耍跨Rust 和 C FFI边界指针。...设计 本节,我们设计这样一个示例: 示例 1 Rust 导出一个 so main 函数在 C 这边,链接 Rust so C 中分配栈内存,交由 Rust 端填充 Rust 端打印 C 端打印...感觉已经没什么可讲了。看过本教程之前内容同学,应该会秒懂。 接着来看示例2代码。 示例2代码 示例2代码,Rust 这边没有变化。...示例2C语言这边是在堆上 malloc 了一块内存,所以程序结束时候,要记得 free 掉。 我们从两个示例对比可以看到,C 这边栈和堆指针,都可以用相同 Rust 代码。...结论 本章通过构造两个示例,演示了 Rust导出共享 一个操作场景,例子清晰明了,可细品。

    48920

    Rust FFI 编程 - Rust导出共享06

    本节主要介绍 Rust 导出共享时,如何通过指针在 Rust 和 C 之间传递结构体。上一节示例是结构体内存在 C 端分配,本节介绍内存在 Rust 这边分配,由 C 填充和使用。...设计 本节示例: Rust 中导出共享,包含三个函数: student_new,Rust 端分配内存并用默认值初始化,由 C 端填充和更新; student_alice,Rust 端分配内存并初始化...,由 C 端使用; student_free,供 C 端用来释放结构体内存 C 中定义main函数,链接 Rust 共享,并调用相关函数; 实现 工程初始化类似之前导出共享示例,导出.so共享要在...结论 本文通过设计一个示例,演示了 Rust 导出共享时,提供内存分配和释放函数,通过指针传递结构体,并在 C 端完美实现使用和更新结构体。...本章示例所有代码:https://github.com/lesterli/rust-practice/tree/master/ffi/example_03。

    98210

    Rust FFI 编程 - Rust导出共享03

    const Foo, x: isize, y: isize) -> isize { let foo = &*foo; foo.method3(x, y) } 然后,用这个接口层代码编译出动态链接,...那么,我们实现 FFI时候,需要这样写: #[no_mangle] extern "C" fn buffer_print_i32(buf: Buffer) { ... } #[no_mangle...size_t len; }; void buffer_print_i32(Buffer_i32 buf); void buffer_print_f32(Buffer_f32 buf); 可见,我们在 FFI...,就是变体中还带数据负载枚举,类似下面这种: enum Foo { Bar(String), Baz, } 既然此处我们是要研究与C对应关系,其实真正Rust要导出共享给C使用场景...组合指定 #[repr(C, u8)] #[repr(C, u16)] 组合指定只能用在带负载枚举上(但是带负载枚举在实际场合中,跨FFI边界场景并不多,如果有必要,后面开专题说明)。

    82920

    Rust FFI 编程 - Rust导出共享01

    有了这种基本思维模型后,我们用 Rust 进行 FFI 编程,就会心中有数,知道什么时候该做什么,不再是一团浆糊了。 从本篇开始,我们进入新领域:在 C 代码中调用 Rust 功能。...调用加法函数,并打印 Rust 代码: // 在 Cargo.toml 中,加入如下两行 [lib] crate-type = ["cdylib"] 要让 Rust 导出动态共享,需要在 Cargo.toml...会在 target/debug/ 下生成 lib{cratename}.so (我们这里为 librustffi3.so)这个动态链接文件。...C 向 Rust 传入一个数组计算元素和并返回 前面两个例子是最简单整型类型参数传递,能说明 Rust 导出共享基本样板操作。但在函数参数这块儿,能说明问题有限。...总结 本篇,我们研究了 Rust 导出动态链接给 C 用基本形式和规范。下一篇,我们会探讨字符串作为函数参数和返回值传递细节。

    95410

    Rust FFI 编程 - 手动绑定 C 入门 01

    ,还是太复杂了,最后还是回归到 Rust Nomicon Book 中 FFI 小节所举例子:snappy。...但可惜,它更多地是一本内部技术参考,而不是一本给初学者看教程。在 FFI 这一节,也是讲得过于简略,并不适合作为初学者入门之用。本篇会大量摘取其中内容。...因为我们现在做正是对 snappy Rust 封装。snappy 是 C 写,编译后,(一般)形成动态链接,安装在系统约定路径中。...其在设计之初,就强调了与 C 生态无缝结合这个目标。同时也让 Rust 具有了对底层系统强大而精确描述能力。厉害! FFI 好像很简单 不~~ 不是那么简单!...如果 FFI 编程,只有这么简单就好啦。我们在本篇,其实只是选了一个最简单

    1.8K31

    Rust FFI 编程 - 手动绑定 C 入门 06

    同时我们也知道 Rust 中所有的闭包都实现了由标准提供 trait Fn、FnMut 或 FnOnce 中一个。...因此,从理论上讲,我们应该能够通过将闭包“拆分”为两部分,匿名类型实例数据和某种类似call()方法函数。这样我们可以获取其中函数部分指针,从而实现将闭包传递给 C 端代码。...和get_callback,代码如下: // ffi/example_10/src/main.rs unsafe extern fn hook(result: c_int, user_data...我们使用闭包原因是需要事先定义一段代码,并在之后某个时候才实际调用它。这里我们将期望调用代码储存在了 closure 中。...本篇完整代码位于:https://github.com/lesterli/rust-practice/tree/master/ffi/example_10

    1.2K20

    Rust FFI 编程 - 手动绑定 C 入门 05

    具体可参见标准文档 fn,解释得非常详尽。 函数指针功能就是指向函数代码片断,可以用函数指针来调用函数,效果跟函数名一样,如上面 C 代码中 cb(result)。...其实我们遇到问题,在 C 领域,早就是一种常见问题(比如一个 GUI 回调函数),所以其实也早就有对应解决方案,比如,使用 C 中魔幻主义 void * 携带一个数据块传递。...从标准页面可以学习到,Rust 中 *const c_void 等于 C const void*,Rust 中 *mut c_void 等于 C void*。...达成我们理想要求。 总结 在本篇,我们研究了 Rust 与 C 如何跨 FFI 边界实现回调函数调用,以及在回调中更新外部数据。...全篇内容,主要参考: http://adventures.michaelfbryan.com/posts/rust-closures-in-ffi/ 感谢作者精彩分享 Rust 标准文档 文章中代码在

    1.5K40

    Rust FFI 编程 - 手动绑定 C 入门 02

    本篇是《手动绑定 C 入门》第二篇。了解第一篇后,我们知道在调用 C 时,需要重新在 Rust 中对该 C 数据类型和函数签名进行封装。...备注:有自动生成绑定工具,比如,bindgen可以自动生成 C 和某些C ++ Rust FFI 绑定。但这个章节不涉及这些。...// ffi/rust-call-c/src/array.rs use std::os::raw::c_int; // 对 C sum 函数进行 Rust 绑定: extern "C" {...#[repr(C)] pub struct OpaqueObject { _private: [u8; 0], } 同样,对该 C 函数进行 Rust FFI 手动绑定,示例如下: extern...总结 在 Rust 中调用 C ,进行 Rust FFI 绑定: 传递结构体类型参数时,可以使用repr属性#[repr(C)]确保有一致内存布局。

    1.2K20

    Rust FFI 编程 - 手动绑定 C 入门 03

    第一个示例: // ffi/rust-call-c/src/c_utils.c int sum(const int* my_array, int length) { int total = 0.../rust-call-c/src/array.rs use std::os::raw::c_int; // 对 C sum 函数进行 Rust 绑定: extern "C" { fn...create, print, release C端代码编译成 .so 动态 这三个函数,导入到Rust中使用 在Rust中,调用Ccreate函数,创建一个资源,并拿到指针 在Rust中,利用这个指针...实现了我们这个场景下核心要求,资源在C那边管理,Rust这边只是借用。但是填数据又是在Rust这边。 搜索标准,我们会发现,Vec也有这两个方法。这其实是对应。...因为在这种跨FFI边界调用情况下,内存分配,完全可能不是同一个分配器做,混用会出各种 undefined behaviour。所以,这些细节一定要注意。

    1.6K10

    luajitffi更快原因_lua return

    luajit ffi 小结 ---- Lua 是一种语法简单,上手快语言,虽然原生比较少,但是可以方便和 C 语言互相调用,常被用于脚本嵌入到 C 程序中。...使用 Lua 调用 C 函数 Lua ,使用该,Luaer 不用再去操作复杂 Lua 栈来粘合两种程序代码,luajit ffi 官方资料。...引入 luajit ffi local ffi = require("ffi") 在 Lua 中调用 C 函数 和 lua C API 一样,Lua 调用 C 函数,需要将 C 函数编译成链接...ffi.load(name [,global]) 这里第二个参数如果为 true,则该被引入全局命名空间,这里使用 ffi.load 需要注意两点: 链接文件必须在 C 动态链接查找路径中,否则会报类似错误...C 程序查找动态链接相同,如上面我生成动态链接文件为 libffimyc.so,我在 ffi.load 中 name 为 ffimyc 调用自己函数,可以直接使用 ffi.load 返回变量调用

    2.1K20
    领券