java.lang.IndexOutOfBoundsException с JNA - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь связать 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

1 Ответ

0 голосов
/ 29 мая 2018

Кажется, что это проблема с 32/64 битной совместимостью системы.Пожалуйста, посмотрите, являются ли ваши зависимости JDK, DLL и DLL 32/64 битными.У меня была такая же проблема несколько дней назад.

...