gpt4 book ai didi

java - 痛饮 :how to deal with pointers in generated Java code

转载 作者:行者123 更新时间:2023-11-30 02:24:46 25 4
gpt4 key购买 nike

我正在使用 SWIG 为我的一个 C 库生成 Java 绑定(bind)。但是我在处理 C 指针时遇到了麻烦。下面是一些代码来演示我的问题:

calc.h 文件:

extern int sum(int a, int b);
extern int sum_1(int *a, int *b);

calc.c 文件:

#include "calc.h"

int sum(int a, int b) {
return a + b;
}

int sum_1(int *a, int *b) {
return *a + *b;
}

calc.i 文件:

%module calc
%{
#include "calc.h"
%}

%include "calc.h"

我使用以下命令生成 Java 绑定(bind)代码:

gcc -c calc.c
swig -java calc.i
gcc -fpic -c calc_wrap.c -I/usr/lib/jvm/java-1.8.0/include -I/usr/lib/jvm/java-1.8.0/include/linux
ld -G calc_wrap.o calc.o -o libcalc.so

现在是我的主要功能:

public class Application {
static {
System.loadLibrary("calc");
}

public static void main(String[] args) {
System.out.println(calc.sum(1, 2));
// System.out.println(calc.sum_1(?, ?));
}
}

上面的代码会正常编译和运行,并按预期打印出 3。问题是,如何使用 calc.sum_1 函数?我完全不知道如何处理 int * 类型。

仅供引用,附上一些由 SWIG 生成的代码:

calc.java 文件:

public class calc {
public static int sum(int a, int b) {
return calcJNI.sum(a, b);
}

public static int sum_1(SWIGTYPE_p_int a, SWIGTYPE_p_int b) {
return calcJNI.sum_1(SWIGTYPE_p_int.getCPtr(a), SWIGTYPE_p_int.getCPtr(b));
}

}

calcJNI.java 文件:

public class calcJNI {
public final static native int sum(int jarg1, int jarg2);
public final static native int sum_1(long jarg1, long jarg2);
}

SWIGTYPE_p_int.java 文件:

public class SWIGTYPE_p_int {
private transient long swigCPtr;

protected SWIGTYPE_p_int(long cPtr, @SuppressWarnings("unused") boolean futureUse) {
swigCPtr = cPtr;
}

protected SWIGTYPE_p_int() {
swigCPtr = 0;
}

protected static long getCPtr(SWIGTYPE_p_int obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
}

非常感谢您的帮助!

最佳答案

默认情况下,Swig 不会生成创建指针的方法,但这里描述了几种方法:http://web.mit.edu/svn/src/swig-1.3.25/Examples/java/pointer/index.html

例如,将此添加到接口(interface)文件的底部:

%include cpointer.i
%pointer_functions(int, intp);

它生成一组实用函数来创建 SWIGTYPE_p_int,其中:

SWIGTYPE_p_int p1 = calc.new_intp();
SWIGTYPE_p_int p2 = calc.new_intp();
calc.intp_assign(p1, 1);
calc.intp_assign(p2, 2);

System.out.println(calc.sum_1(p1, p2));

calc.delete_intp(p1);
calc.delete_intp(p2);

关于java - 痛饮 :how to deal with pointers in generated Java code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45140299/

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