问题标签 [nativecall]

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.

0 投票
0 回答
193 浏览

raku - 有什么方法可以列出 Raku 的本机接口中可用的函数和数据结构吗?

主要是为了创建合理的示例,我想知道哪些数据结构和函数可用于 Raku 的native界面,如

有没有办法列出它们?我特别想获得C++函数和数据结构的例子,这样我就不必创建和编译外部库来创建一个例子。

0 投票
1 回答
160 浏览

raku - 在 Perl 6 中,如何使用 NativeCall 接口将原始字节转换为浮点?

Perl 6 IRC 频道中的此对话和 Martin Barth 发布的问题中,我正在尝试使用用于该目的的 Perl6 NativeCall 接口重现此 C 代码。这是我尝试过的:

这会产生一个错误:

我将其解释为,您已将其声明为整数,我无法将其转换为原始内存,以便可以将其从这里复制到那里。

这只是回答 Martin Barth 提出的更一般性问题的一种可能方式:如何将原始字节转换为浮点数。也许还有其他方法可以做到这一点,但无论如何我都很想知道如何将 C 程序转换为 NativeCall 等价物。

更新:与此同时,这是另一篇文章试图解决的原始问题

0 投票
1 回答
159 浏览

raku - 本机 localtime() 段错误

localtime在尝试公开Perl 6 中的功能时,我似乎做错了什么:

在 下运行perl6-lldb-m,我得到:

我在这里做错了什么明显的事情吗?

更新:最终的工作解决方案:

0 投票
2 回答
786 浏览

c - 如何将用户数据传递给回调函数

我正在开发一个 NativeCall 接口;有一个接受回调的 C 函数,定义为:

我的第一反应是:

但是当调用这个函数时会产生一个错误:

如果我忽略 user_data 参数,一切正常,所以声明的其余部分都很好:我只是没有将任何额外的数据传递给回调函数。

在其他情况下,我使用 Buf 将(可能)二进制数据块传递给 C 函数并且它起作用了;这里的区别是回调函数。知道如何解决这个问题吗?

(使用 perl6 2018.03)

0 投票
2 回答
160 浏览

c - 使用 NativeCall 在不同平台上处理 C typedef

是否有一种方便的方法来处理在不同平台上可能具有不同价值的 C typedef?

例如

目前我正在像这样在 Perl 6 中处理这个

0 投票
1 回答
231 浏览

raku - perl 6上的三指针本机调用

我尝试用 perl6 包装 sd-bus,但是函数调用三重指针有问题。
来自 sd-bus.h

尝试本地调用

我打电话,但我不知道如何取消对 array(@) 获取和可激活变量的引用。

谢谢,对不起我的英语

[编辑]
dwarring 回复解决了我对 derefencies Pointer[CArray[Str]] 的问题

这是一个测试代码:

0 投票
4 回答
529 浏览

raku - 如何在 Perl 6 中声明固定大小的原生数组?

我正在尝试在 Perl 6 中声明以下 C 结构:

我的问题是我不知道如何int A[2];使用内置的 NativeCall api 声明该部分。

所以我所拥有的是:

但是,我知道该has CArray[int32] $.A;部分是错误的,因为它没有在我的结构中声明仅占用 2 个int32大小的部分。

0 投票
1 回答
188 浏览

raku - 使用 NativeCall 将 CStruct 中的内联 CArray 传递给共享库

这是“如何在 Perl 6 中声明固定大小的原生数组? ”的后续问题。

在那个问题中,讨论了如何将固定大小的数组合并到CStruct. 在这个答案中,建议使用HAS内联 aCArrayCStruct. 当我测试这个想法时,我遇到了一些奇怪的行为,在问题下方的评论部分无法解决,所以我决定将它写成一个新问题。这是我的 C 测试库代码:

slib.c

要从中生成共享库,我使用了:

然后,Perl 6 代码:

p.p6

脚本的输出是:

问题

  • 为什么nativesizeof( $s )给出 24(而不是 20 的期望值)?

  • 为什么B从 C 函数打印时结构中的数组内容与预期不符?

注意

我正在使用 Ubuntu 18.04 和 Perl 6 Rakudo 版本 2018.04.01,但也使用版本 2018.05 进行了测试

0 投票
2 回答
230 浏览

raku - 从本机指针中获取数据

将数据放入 Perl 6 Native 指针中没什么大不了的:

但是,我认为Pointer[int]除了创建一个函数来完成它之外,没有其他方法可以让它们脱离出来,因为nativecast显然是在相反的方向上工作,或者至少不是在强制转换为非本地类型的方向上(这应该是显而易见的姓名)。你会怎么做?

更新:例如,使用 Array 会使它更可行。然而

这有效,但会产生错误:Don't know how many elements a C array returned from a library

更新 2:根据Christoph 的回答(谢谢!),我们可以对此进行详细说明,我们可以将这些值放回Buf

我们需要将指针转换为与缓冲区使用的完全相同的类型,然后我们使用指针算法来运行它。但是,我们习惯于$blob.bytes知道何时结束循环,这仍然有点 hacky。有没有更直接的方法?或者只是一种使用 Bufs/Blobs 的方式,以便可以轻松地将它们复制到 Native 领域并返回?

0 投票
1 回答
110 浏览

raku - 在 NativeCall perl6 模块中声明指针 [void] 的奇怪消息

这些代码片段可能看起来很奇怪,这是因为我从我的原始代码开始并切断了部分,直到我到达重现错误的最小指令集。所以忍受表面上的无用。有两个 perl6 模块,一个use是另一个,一个是程序。这是第一个模块:

第二个模块包含在第一个模块中,但实际上没有使用它的任何部分:

程序创建一个 test1 对象并调用测试方法:

该程序输出一个错误,显然是由类 test1 的方法 test 中的赋值引起的:

如果我在第二个类中注释掉$.wrongdoer,程序执行没有错误。我正在运行 rakudo 2018.06。这是 NativeCall 模块中的错误还是我看不到的其他错误?