Я пытаюсь связать library.so с Java IHM, и я немного борюсь с массивом, который я создал .so самостоятельно в c ++, так что давайте посмотрим, что там .h
class WestgardInterface {
private:
/*ATTRIBUTS*/
/** WestgardInterface instance*/
static WestgardInterface *ms_instance;
protected:
WestgardInterface();
public:
/*DESTRUCTOR*/
~WestgardInterface();
static WestgardInterface *getInstance();
void WGevaluateWithListOnly( Measure m[], float mean, float sd);
};
extern "C" void WGevaluateWithListOnly( Measure m[], float mean, float sd){
WestgardInterface* lib = WestgardInterface::getInstance();
return lib->WGevaluateWithListOnly( m, mean, sd);
}
тогда есть мой файл cpp
WestgardInterface *WestgardInterface::ms_instance = nullptr;
WestgardInterface::WestgardInterface(){}
WestgardInterface::~WestgardInterface() {}
WestgardInterface *WestgardInterface::getInstance(){
if (nullptr == ms_instance)
{
ms_instance = new WestgardInterface();
}
return ms_instance;
}
void WestgardInterface::WGevaluateWithListOnly(Measure m[], float mean, float sd) {
cout<<"mean "<<mean<<endl<<"sd "<<sd;
}
вы можете видеть, что я даже не использую массив в моем коде c ++, поэтому я думаю, что проблема должна быть в части java
public class Westgard {
static {
System.setProperty("jna.library.path","../logic/resources/calculator");
}
public static void main(String[] args) {
WGInputs.ByValue jnaInputs [] = (WGInputs.ByValue[])new WGInputs.ByValue().toArray(2);
WGInputs.ByValue input = new WGInputs.ByValue();
Measure.ByValue m = new Measure.ByValue();
m.valeur = 18;
Date.ByValue d = new Date.ByValue();
d.m_day = 10;
d.m_month = 10;
d.m_year = 10;
d.m_hour = 12;
d.m_min = 12;
d.m_sec = 12;
m.date = d;
input.m = m;
jnaInputs[0] = input;
jnaInputs[1] = input;
InterfaceLibWestgard.INSTANCE.WGevaluateWithListOnly(jnaInputs, 12, 1);
}
}
затем, когда я пытаюсь выполнить его, я получаю эту ошибку
Exception in thread "main" java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=32, offset=64
at com.sun.jna.Memory.boundsCheck(Memory.java:185)
at com.sun.jna.Memory.share(Memory.java:114)
at com.sun.jna.Structure.toArray(Structure.java:1434)
at com.sun.jna.Structure.toArray(Structure.java:1453)
at p65.logic.westgard.Westgard.main(Westgard.java:12)
Я знаю, что это происходит из моего массива, потому что если размер массива до 1, он работает, поэтому хотел бы знать, как я должен объявить свой массивв коде Java