在Java Native Access (JNA)中,可以使用指针作为方法参数来访问本地结构数组
typedef struct {
int x;
int y;
} Point;
import com.sun.jna.Structure;
public class Point extends Structure {
public int x;
public int y;
protected java.util.List<String> getFieldOrder() {
return java.util.Arrays.asList("x", "y");
}
}
#include <stdio.h>
void printPoints(Point* points, int count) {
for (int i = 0; i < count; i++) {
printf("Point[%d]: (%d, %d)
", i, points[i].x, points[i].y);
}
}
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
public interface MyLibrary extends Library {
MyLibrary INSTANCE = Native.load("mylibrary", MyLibrary.class);
void printPoints(Pointer points, int count);
}
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
public class Main {
public static void main(String[] args) {
Point[] points = new Point[]{
new Point(1, 2),
new Point(3, 4),
new Point(5, 6)
};
Memory memory = new Memory(points.length * Point.size());
for (Point point : points) {
memory.write(Point.size() * point.x, point.getPointer(), Point.size());
}
MyLibrary.INSTANCE.printPoints(memory, points.length);
}
}
注意,这个示例中的本地库名称为mylibrary
,并且在C代码中使用了#include <stdio.h>
。确保将本地库编译为共享库(如.so
文件或.dll
文件),并将其放在适当的路径下。
现在,当你运行Java程序时,它将调用本地方法printPoints
,并将指向结构数组的指针作为参数传递。
领取专属 10元无门槛券
手把手带您无忧上云