Доступ к структуре C++ с двумя векторами из Java с помощью JNAJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Доступ к структуре C++ с двумя векторами из Java с помощью JNA

Сообщение Anonymous »

Это следует из моего предыдущего вопроса. Теперь мне нужно получить доступ к структуре C++, которая имеет несколько членов типа std::vector или std::vector. Однако, хотя мне кажется, что я успешно получил доступ к первому члену, второй производит мусор. Код ниже:

Код: Выделить всё

my_struct.cpp:

Код: Выделить всё

#include 
#include 

#include 

struct MyStruct {
int intVectorSize;
int doubleVectorSize;
std::vector intVector;
std::vector doubleVector;
};

extern "C" {

MyStruct* create_my_struct() {
MyStruct* myStruct = new MyStruct();

myStruct->intVectorSize = 2;
myStruct->doubleVectorSize = 2;
myStruct->intVector.push_back(5);
myStruct->intVector.push_back(6);
myStruct->doubleVector.push_back(1.1);
myStruct->doubleVector.push_back(2.3);

return myStruct;
}

void delete_my_struct(MyStruct* myStruct) {
delete myStruct;
}
}

Код: Выделить всё

BasicStruct.java:
import com.sun.jna.Structure;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

import java.util.Arrays;

import com.sun.jna.Library;
import com.sun.jna.Structure.FieldOrder;

public class BasicStruct {
public interface MyCppLibrary extends Library {
MyCppLibrary INSTANCE = (MyCppLibrary) Native.load("mycpp", MyCppLibrary.class);

@FieldOrder({"intVectorSize", "doubleVectorSize", "intVector", "doubleVector"})
public class MyStruct extends Structure {
public int intVectorSize;
public int doubleVectorSize;

public Pointer intVector;
public Pointer doubleVector;
}

MyStruct create_my_struct();
void delete_my_struct(MyStruct struct);

}

public static void main(String[] args) {
MyCppLibrary lib = MyCppLibrary.INSTANCE;

MyCppLibrary.MyStruct myStruct = lib.create_my_struct();

System.out.println("intVectorSize: " + myStruct.intVectorSize);
System.out.println("doubleVectorSize: " + myStruct.doubleVectorSize);
System.out.println("intVector: " + myStruct.intVector);
System.out.println("doubleVector: " + myStruct.doubleVector);

int[] intArray = myStruct.intVector.getIntArray(0, myStruct.intVectorSize);
double[] doubleArray = myStruct.doubleVector.getDoubleArray(0, myStruct.doubleVectorSize);

System.out.println("intVector contents: " + Arrays.toString(intArray));
System.out.println("doubleVector contents: " + Arrays.toString(doubleArray));

lib.delete_my_struct(myStruct);

}
}
Компиляция кода cpp с использованием g++ в WSL2 под управлением Ubuntu 20.04 в общую библиотеку, имя которой соответствует имени, загружаемому из кода Java:

Код: Выделить всё

g++ -v -shared -fPIC -o libmycpp.so my_struct.cpp
И компилируем и выполняем код Java (гарантируя, что jar-файл JNA находится в пути к классам):

Код: Выделить всё

 $ javac -classpath ./jars/jna-5.15.0.jar  BasicStruct.java
$ java  -classpath ./jars/jna-5.15.0.jar:. BasicStruct
Я получаю следующие результаты:

Код: Выделить всё

intVectorSize: 2
doubleVectorSize: 2
intVector: native@0x7f0ea8294600
doubleVector: native@0x7f0ea8294608
intVector contents: [5, 6]
doubleVector contents: [6.9469400861921E-310, 0.0]
Обратите внимание, что хотя выходные данные для intVector верны, выходные данные для показанного атрибута doubleVector неверны.
Я попробовал другие комбинации упорядочивания атрибутов и заметил, что после чтения первого вектора последующие атрибуты кажутся поврежденными.
Есть предложения, как это исправить? Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -using-jna
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»