SWIG:如何处理生成的 Java 代码中的指针
SWIG:how to deal with pointers in generated Java code
我正在使用SWIG为我的一个C库生成Java绑定。但是我在处理 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 绑定代码:
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
例如,将其添加到接口文件的底部:
%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代码编译和运行c++代码
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- SWIG:如何处理生成的 Java 代码中的指针
- 使用 CMake 和 Maven 构建C++和 Java 代码,并捆绑在一个罐子里
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 当我从java代码执行C++时不显示任何输出
- 从用户控制台获取输入 - Java 代码
- 使用大多数Java代码制作可执行文件,但可能添加了其他语言
- 从C++调用 java 代码:exception java.lang.NoSuchMethodError
- 是否可以从本机应用程序调用 Java 代码
- 从运行C++代码调用正在运行的 Java 代码,反之亦然
- 将 java 代码转换为 c++
- 是否可以从您的C++和Java代码进行OpenGL ES调用
- 简单的 Java 代码,在创建等效C++(私有静态成员和公共访问器方法)时遇到问题
- 无法用C++编写相同的 Java 代码"cannot initialize class member here"因为错误
- 如何使用QAndroidJniObject从Qt内部调用Java代码
- 将Java代码翻译成C++
- 如何使用Java代码中使用和返回.dll对象的函数
- 当我从Java代码执行C++程序时,我应该如何测量它的执行时间