Код: Выделить всё
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);
}
}
Код: Выделить всё
g++ -v -shared -fPIC -o libmycpp.so my_struct.cppКод: Выделить всё
$ java -classpath ./jars/jna-5.15.0.jar BasicStruct
$ 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]
Я попробовал другие комбинации упорядочивания атрибутов и заметил, что после чтения первого вектора последующие атрибуты кажутся поврежденными.
Есть предложения, как это исправить? Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -using-jna
Мобильная версия