JNA 将 swift 指针从 Java Android 传递给 C

JNA passing the equivalent of swift pointer from Java Android to C

我在尝试将 Java 中此 Swift 代码的实现传递给 C 时遇到了一些困难。非常感谢我使用 JNA 在 Java 之间集成的任何建议和 Matlab 生成的 C 代码。

这是 Swift 调用:

GetResult(uptime, &result_out)

它映射到 C 代码:

void GetResult(double time, Result_t *Result)

C 结构 Result_t 在这里太大了,但是它是双精度和整数的组合。

我明白 &result_out 是一个 swift 指针?如何最好地实现 Java 中的 Swift 指针的等价物,然后能够将其传递给期望指向 Result_t 的指针的 C,正如我提到的那样由双精度和整数组成的结构。

其中&表示变量的内存地址。在本例中,它表示Result结构的内存地址。

在 C 中,您可以看到 * 符号用于表示同一事物:要作为第二个参数传递的变量是基础数据的 reference/memory 地址。

它们通常成对出现:如果您定义了一个变量 foo,您可以轻松地将 &foo 传递给任何需要指向 foo 指针的方法,而该方法本身使用* 表示法让您知道它需要该指针。

对于许多 JNA 结构,您需要密切注意这些符号。例如,知道是传递 int 还是 IntByReference 是关键。但幸运的是(为了便于编写代码,不幸的是为了保持一致性)JNA Structure class 的行为是不同的。底线是,默认情况下,当 Structure 作为参数包含在 method/function(最常见的应用程序)中时,使用指针或结构的 ByReference 版本。因此,在这种特殊情况下,假设您已将所有信息映射到 class Result extends Structure,您只需将 result 传递到 result = new Result();

有一些方法可以使用 ByReferenceByValue 来覆盖此默认行为,但这超出了您的问题范围。