java.lang.IndexOutOfBoundsException with JNA
java.lang.IndexOutOfBoundsException with JNA
我尝试将 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位。几天前我遇到了同样的问题。
相关文章:
- Problems with std::cin.fail()
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 避免碎片化的ClientHellos with OpenSSL (DTLS)
- Issues with Win32 ReadProcessMemory API
- Qt with WinAPI MouseProc
- [[maybe_unused]] with structured_binding?
- Issue with WriteProcessMemory
- OpenCV RTP-Stream with FFMPEG
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- std::adjacent_difference with std::chrono time_point
- DLL Made with CMake 使程序崩溃
- QtCreator with C 库中的链接器问题
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- JNA - 传递字符* 以运行
- specialized std::default_delete with QQmlComponent
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- Inference pytorch C++ with alexnet and cv::imread image
- java.lang.IndexOutOfBoundsException with JNA