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();
。
有一些方法可以使用 ByReference
和 ByValue
来覆盖此默认行为,但这超出了您的问题范围。
我在尝试将 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();
。
有一些方法可以使用 ByReference
和 ByValue
来覆盖此默认行为,但这超出了您的问题范围。