为了账号安全,请及时绑定邮箱和手机立即绑定

Java JNA WinAPI 函数在 JVM 中静默崩溃

Java JNA WinAPI 函数在 JVM 中静默崩溃

小怪兽爱吃肉 2021-09-29 17:38:51
我正在尝试使用jna从 java调用 winapi 函数CallNtPowerInformation。这是我的代码:NativeProcessorPowerInformation[] systemProcessors = new NativeProcessorPowerInformation[getProcessorCount()];for (int systemProcessorIndex = 0; systemProcessorIndex < systemProcessors.length; systemProcessorIndex++) {    systemProcessors[systemProcessorIndex] = new NativeProcessorPowerInformation();}nativeLibraryPowrprof.CallNtPowerInformation(11, null, new NativeLong(0),    systemProcessors[0], new NativeLong(systemProcessors.length * systemProcessors[0].size()));dll 是这样实例化的:nativeLibraryPowrprof = Native.loadLibrary("powrprof", NativeLibraryPowrprof.class, W32APIOptions.DEFAULT_OPTIONS);这是我使用的库接口:public static interface NativeLibraryPowrprof extends StdCallLibrary {    public int CallNtPowerInformation(int informationLevel, Pointer lpInputBuffer, NativeLong nInputBufferSize, Structure lpOutputBuffer, NativeLong nOutputBufferSize);    @ToString    public static class NativeProcessorPowerInformation extends Structure {        public ULONG Number;        public ULONG MaxMhz;        public ULONG CurrentMhz;        public ULONG MhzLimit;        public ULONG MaxIdleState;        public ULONG CurrentIdleState;        @Override        protected List<String> getFieldOrder() {            return Arrays.asList("Number", "MaxMhz", "CurrentMhz", "MhzLimit", "MaxIdleState", "CurrentIdleState");        }    }}此代码有效(持续 10 秒)结果正确,但有时在 10/20 秒后它会静默地使 jvm 崩溃,我得到退出代码 -1073740940(堆损坏)。也许我错过了什么?
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您正在传递Structure由不同Structure实例构造的 Java 数组中第一个的地址。被调用者需要一个连续的内存块,你只传递一个单一结构大小的块,但告诉被调用者它是 N 个结构的大小。

使用Structure.toArray()获得连续分配的内存块。然后,您可以根据需要操作数组的成员。JNA 应该在调用后自动更新数组的所有成员。


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 351 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信