java.lang.IndexOutOfBoundsException with JNA

java.lang.IndexOutOfBoundsException with JNA

本文关键字:JNA with IndexOutOfBoundsException lang java      更新时间:2023-10-16

我尝试将 library.so 链接到java IHM,但我对数组有点挣扎 我自己用 c++ 制作了 .so,所以让我们看看里面有什么 .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 代码中声明我的数组

这似乎是 32/64 位系统协同性的问题。请查看您的JDK,DLL和DLL依赖项是否为32/64位。几天前我遇到了同样的问题。