Я пытаюсь создать библиотеку C ++, которую можно использовать из Java через JNA. Я делаю несколько тестов, чтобы вернуть массив структур. Я создал следующую структуру:
C ++:
namespace structures
{
typedef struct _Point {
int x, y;
} Point;
}
Java:
public class Point extends Structure {
public Point() {
// required for toArray()
}
public Point(Pointer pointer) {
super(pointer);
}
public int x, y;
}
Итак, у меня есть метод C ++, который возвращает массив точек:
extern "C" __declspec(dllexport) structures::Point* getPoints(){
structures::Point *p;
p = (structures::Point *) malloc( 4 * sizeof(structures::Point) );
p[0].x = 10;
p[0].y = 20;
p[1].x = 30;
p[1].y = 40;
p[2].x = 50;
p[2].y = 60;
p[3].x = 70;
p[3].y = 80;
return p ;
А в Java это интерфейс, который объявляет доступ к библиотеке:
public interface Multiplyt extends Library{
Pointer getPoints();
}
А вот код, который тестирует библиотеку:
Pointer pointer = test.getPoints();
Point point, points[];
point = new Point(pointer);
points = (Point[]) point.toArray(4);
System.out.println("0x:"+points[0].x + " 0y:" + points[0].y + " 1x:"+ points[1].x + " 1y:" + points[1].y);
System.out.println("2x:"+points[2].x + " 2y:" + points[2].y + " 3x:"+points[3].x + " 3y:" + points[3].y);
Вывод этих команд:
0x:0 0y:0 1x:30 1y:40
2x:50 2y:60 3x:70 3y:80
Итак, как вы можете видеть, структура точек в позиции 0 не имеет значений для x или y (она имеет 0 и 0 и должна быть 10 и 20). Почему это происходит? Как я могу это исправить?