问题标签 [ffi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - Ruby FFI - 将 C 调用捕获到 exit()
我有一个带有 FFI 绑定到自定义 RPC 系统的 Rails 应用程序。exit()
不幸的是,C 代码在无法连接到 RPC 服务器时调用,从而终止了整个 Rails 应用程序。
是否可以exit()
在 Ruby 中捕获调用?我宁愿不必更改 C 代码。
haskell - GHC 7 中的 FFI 存根
我正在尝试编译一个带有一些 FFI 代码的 Haskell 模块。它曾经在带有 GHC 6 和自定义 GHC 7 的旧 Haskell 平台下工作以获得 64 位版本。
使用 64 位版本的 GHC 7 升级到最新的 Haskell 平台已停止工作。似乎 GCC 在处理 GHC 吐出的存根文件时遇到了一些问题——它们使用的 GHC 框架头文件在查找标准 C 文件时遇到了麻烦。这只是我遇到的众多错误之一:
我似乎对 32 位版本的平台也有同样的问题,并且相同的标准文件在正常的 GCC 编译中可以正常工作。为什么这不起作用?
ruby - 如何在 RubyFFI 中将结构指定为函数的返回值?
我必须加载几个从库本身返回结构的函数。
RubyFFI 的 Wiki 页面似乎已经过时,所以我在这里有点迷茫。
如何创建FFI::Struct
,以及如何将其指定为本机函数的返回类型?
ruby - Protect Ruby code
I'm writing Ruby app and I want to use some top-secret algorithms. So how would be the best to protect them from unauthorized access.
I have 2 ideas:
- write them in C and load using FFI (I wonder if It's possible this way)
- Marshal ruby code, encode it and then store in file
Maybe someone know better idea or can show me that these ideas are stupid or wrong. Thanks in advice.
language-agnostic - 了解外部函数接口 (FFI) 和语言绑定
混合不同的编程语言一直是我不太了解的事情。根据这篇 Wikipedia article,可以通过以下几种方式完成外部函数接口(或 FFI):
- 要求以特定方式指定或实现可被宿主语言调用的来宾语言函数;经常使用某种兼容性库。
- 使用工具来自动“包装”客户语言函数和适当的胶水代码,执行任何必要的翻译。
- 使用包装库
- 限制可以跨语言使用的宿主语言能力集。例如,从 C 调用的 C++ 函数可能(通常)不包含引用参数或抛出异常。
我的问题:
第一种、第二种和第三种方式有什么区别?在我看来,他们都是将被调用语言的代码编译成带有目标文件和头文件的库,然后由调用语言调用。
它链接的一个消息来源说,可以通过多种方式实现 FFI:
- 要求目标语言中调用的函数实现特定的协议。
- 实现一个包装库,该库采用给定的低级语言函数,并用代码“包装”它以进行与高级语言约定的数据转换。
- 要求声明为原生的函数使用高级功能的子集(与低级语言兼容)。
我想知道链接源中的第一种方式是否与维基百科中的第一种方式相同?
这个来源中的第三种方式是什么意思?它是否对应于维基百科中的第 4 种方式?
在同一来源中,当比较它列出的三种方式时,似乎可以说填补两种语言之间差距的工作正在逐渐从被调用语言转移到调用语言。我想知道如何理解?对于维基百科的四种方式,这种转变是否也是如此?
语言绑定和 FFI 是等价的概念吗?它们有何关联和不同?
从编程语言到库或 OS 服务的绑定是用该语言提供该服务的 API。
我想知道维基百科的引文或以下每个示例的来源属于哪种方式?
- 通用对象请求代理架构 (CORBA)
- 在 C++ 中调用 C,通过 C++ 中的 extern "C" 声明来禁用名称修改。
- 在 Matlab 中调用 C,通过MATLAB Interface to Shared Libraries,即先通过 gcc 等通用 C 编译器将 C 代码编译成共享库,然后通过 Matlab 函数 loadlibrary()、calllib 加载、调用和卸载共享库() 和卸载库()。
- 在 Matlab 中调用 C,通过创建 C/C++ 语言 MEX 文件
- 通过mcc 编译器在 C 中调用 Matlab
- Calling C++ in Java, by JNI和 Calling Java in C++, 同样由JNI
- 使用SWIG以其他语言调用 C/C++
- 通过Ctypes 模块在 Python 中调用 C。
- 赛通
- 在 Python 中调用 R,由RPy
- 从各种语言(如 Python、Fortran 和 Java)到 OpenGL 的编程语言绑定
- 来自各种语言(例如 C++、Python、Java、Common Lisp)的 C 库(例如 Cairo )的绑定
scheme - 策略计划 FFI
我正在尝试使用 ffi 来调用 opencv 的 cvReleaseCapture,
无效 cvReleaseCapture(CvCapture** 捕获);
http://www.ai.rug.nl/vakinformatie/pas/content/Highgui/opencvref_highgui.htm
我努力了,
(定义释放捕获(c-lambda((指针(指针“CvCapture”)))无效“cvReleaseCapture”))
没用。
haskell - Haskell、FFI 和 Grand Central Dispatch?
我正在考虑一种函数式语言,它可以在 FreeBSD、OSX、iOS 下与我的 C/Objective-C 环境很好地配合使用。看起来我最好的选择是为特定函数创建函数式语言库,用 Haskell 编写,使用 GHC 编译,并使用 FFI 将此函数式代码作为标准 C 调用调用。
我的问题是,在这种情况下如何处理并发? 使用函数式语言的一个动机是,对于我想要对不可变数据集进行操作的问题,我想要进行大量的并行化。但是,使用我在这里详述的方法,我会得到任何并行化吗?看来我可以编译并指定使用 2 个线程,但是有没有办法使用 GCD 而不是线程(出于所有原因 GCD 比线程好,例如每个平台自动扩展的并行化量)?或者,正如我所描述的那样使用 FFI,我是否完全失去了多线程的能力?
这种语言似乎最适合我正在尝试做的事情,但我想在我投入大量时间真正学习它之前了解它是否合适
haskell - 用于 pdflib 的 Haskell FFI
我正在尝试在 64 linux 上使用 c2hs 为 pdflib 库( pdflib.com )编写 ffi。您可以从他们的网站免费下载 pdflib(全功能评估。)
我尝试编译并运行他们的 hello.c 演示程序,它运行良好。
据我了解,我只需要 2 个文件即可使其工作:pdflib.h 和 libpdf.a
所以我把它们都放到 hello 文件夹中,写了一个 chs 文件,它编译并生成了 hs 文件。但是当我尝试编译我的 Hello.hs 程序时,阴谋集团抱怨
Cabal:缺少对外部库的依赖:* 缺少 C 库:pdflib
我尝试通过 --extra-include-dirs 和 --extra-lib-dirs 为其指定文件夹名称,但它没有帮助。
如何使用 pdflib.h 和 libpdf.a 文件编译 haskell 程序?
macos - 错误:安装 ffi 时出错:错误:无法构建 gem 原生扩展
我在 Mac 64 位中收到此错误,并在机器上安装了 xcode。
performance - Haskell FFI/C 的性能考虑?
如果使用 Haskell 作为从我的 C 程序调用的库,那么调用它会对性能产生什么影响?例如,如果我有一个问题世界数据集,比如 20kB 的数据,我想运行类似的东西:
这里会发生什么——我是否可以将 20kB 的数据作为全局不可变引用保存在 Haskell 代码可以访问的某个地方,或者我必须每次都创建该数据的副本?
令人担忧的是,这些数据可能会更大,更大——我还希望编写对更大数据集起作用的算法,使用与多次调用 Haskell 代码所使用的不可变数据相同的模式。
另外,我想将其并行化,例如 dispatch_apply() GCD 或 Parallel.ForEach(..) C#。我在 Haskell 之外进行并行化的理由是,我知道我将始终对许多单独的函数调用(即 1000 个参与者)进行操作,因此在 Haskell 函数中使用细粒度并行化并不比在 C 级别管理它好。正在运行 FFI Haskell 实例“线程安全”,我如何实现这一点 - 每次启动并行运行时是否需要初始化 Haskell 实例?(如果必须的话,似乎很慢..)如何以良好的性能实现这一目标?