Java JNA:无效的内存访问

Java JNA:无效的内存访问,java,jna,Java,Jna,我编写了一个小型C库,它从DLL中提取信息(一个键) GetKey.h #pragma once #include <stdint.h> #define getKey(x) getKeyL(x) #define getKey(x,y) getKeyP(x,y) void __declspec(dllexport) getKeyP(char *path, uint8_t key[]); void __declspec(dllexport) getKeyL(uint8_t key[

我编写了一个小型C库,它从DLL中提取信息(一个键)

GetKey.h

#pragma once

#include <stdint.h>

#define getKey(x) getKeyL(x)
#define getKey(x,y) getKeyP(x,y)

void __declspec(dllexport) getKeyP(char *path, uint8_t key[]);
void __declspec(dllexport) getKeyL(uint8_t key[]);
每当调用
getKeyP
getKeyL
我尝试过将参数类型从
byte[]
更改为
Pointer
以及
ByteBuffer
,我也尝试过
extend
ing
StdCallLibrary
(这对我来说最初没有多大意义,但尝试一下也不会有什么坏处,不是吗?)。。。我知道代码是有效的,因为我已经为它编写了一个小的测试应用程序:

#include <stdio.h>
#include "GetKey.h"


int main()
{
    uint8_t key[8];
    getKeyP(NULL, key);

    for (int i = 0; i < 8; ++i)
    {
        printf("%02X ", key[i]);
    }
    getchar();
    return 0;
}

在将调试器附加到DLL并进行调试后,我发现异常的原因是在预期字符串之后传递的“垃圾”字符。 我通过更改Java代码解决了这个问题:

public static void getKey(String path, byte[] key)
{
    INSTANCE.getKeyP((path + '\0').getBytes(), key);
}

现在它可以按预期的方式工作(-:

在将调试器附加到我的DLL并进行调试之后,我发现异常的原因是在预期字符串之后传递的“垃圾”字符。 我通过更改Java代码解决了这个问题:

public static void getKey(String path, byte[] key)
{
    INSTANCE.getKeyP((path + '\0').getBytes(), key);
}

现在它按预期工作(-)

您应该考虑到
LoadLibrary
可能会失败。您还可以介绍一下如何在Java中调用该函数吗?在这种情况下,我不是会得到一个NullPointerException吗?我已经尝试更改代码尝试加载DLL的顺序,其中一个当然是32位DLL,另一个是64位DLL(或许我已经完全离开这里了)如果
lib==0
,您将尝试在
0x1340
处调用函数。您可能会遇到分段错误或非法内存访问。您应该考虑到
LoadLibrary
可能会失败。您是否还可以包括在Java中调用函数的方式?在t中我不会得到NullPointerException我试过改变代码加载DLL的顺序,一个是32位的DLL,另一个是64位的DLL(或者我完全不喜欢这里)如果
lib==0
,您将尝试在
0x1340
处调用函数。您可能会遇到分段错误或非法内存访问。您可以将第一个参数的类型更改为
String
。JNA可以为您封送。您可以将第一个参数的类型更改为
String
。JNA可以为marsha我会帮你的。
byte[] key = new byte[8];
GetKey.getKey(key);
public static void getKey(String path, byte[] key)
{
    INSTANCE.getKeyP((path + '\0').getBytes(), key);
}