Java JNA:无效的内存访问
我编写了一个小型C库,它从DLL中提取信息(一个键) GetKey.hJava 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[
#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
ingStdCallLibrary
(这对我来说最初没有多大意义,但尝试一下也不会有什么坏处,不是吗?)。。。我知道代码是有效的,因为我已经为它编写了一个小的测试应用程序:
#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);
}