gpt4 book ai didi

java - 配置 SWIG 以使用 int32_t 输出参数为 C 函数创建适当的 Java 数据类型

转载 作者:行者123 更新时间:2023-11-29 06:06:39 24 4
gpt4 key购买 nike

我在从我的 Java 实现中为 fetchByType C 函数的长度参数传递适当的 Java 数据类型时遇到问题(均在下方)。在 C 端,*length 参数是一个指向长度变量(输出)的指针,用于指示要从 fetchByType C 函数返回的数据的大小。我尝试使用 SWIG %apply int32_t { int32_t * } 并从我的 Java 实现中传递一个初始化为 0 的 int,但是失败了。我也试过如下所示传入 SWIGTYPE_p_int,但这也不起作用。不幸的是,我没有异常(exception),因为这只是崩溃。

C 函数:

void * fetchByType(struct row_t *result_row, type_t attribute, int32_t *length);

从 SWIG 生成的 Java:

public static String fetchByType(SWIGTYPE_p_result_row_t result_row, type_t attribute, SWIGTYPE_p_int length)

Java 实现:

SWIGTYPE_p_int length = new SWIGTYPE_p_int();
fetchByType(result_row, attribute, length)

最佳答案

这里的问题是您需要将可以更改的内容传递给 C 函数。这意味着您不能在 Java 中使用原语(例如 int),因为 Java 总是按值传递原语。

只有一种真正明智的方法可以解决这个问题。事实上,SWIG 已经提供了一些类型映射,我们可以使用它们将其作为数组传递。 Java 中的数组是“对象”,因此 int[] 通过引用传递,即使 int 不是。基于您上面显示的功能的简化示例,首先是 test.h:

inline void fetchByType(int32_t *length) {
*length = 123;
}

还有一个模块文件,test.i:

%module test

%{
#include "test.h"
%}

// knows about things like int *OUTPUT:
%include "typemaps.i"
// knows about int32_t
%include "stdint.i"
// let's have an int32_t *OUTPUT for our int32_t *lenght
%apply int32_t *OUTPUT { int32_t *length }

%include "test.h"

这只是确保我们应用适当的 *OUTPUT 类型映射。 (stdint.i 为您将其映射到真正的 C 基元上)。我测试了:

public class run {
public static void main(String[] argv) {
int arr[] = new int[1];
test.fetchByType(arr);
System.out.println(arr[0]);
}
}

这有点像 hack1,但它是可用的。另一种方法可能是使用 java.lang.Integer ,它也代表一个 int 并且是一个适当的 Object 因此通过引用传递。问题是 java.lange.Integer is immutable但是,我实际上并不确定它在 JNI 端是如何工作的,无法提供这方面的示例。

1 其他语言 SWIG 支持更改某些类型映射的返回类型,并为 OUTPUT 参数返回元组或类似内容,但这在 Java 中并不可行。

关于java - 配置 SWIG 以使用 int32_t 输出参数为 C 函数创建适当的 Java 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com