Java 写入文件时,JNA内存访问无效 原因,我正在为C++ DLL编写一个JNA包装器(用GCC和MIW32编译)
write16字节.dllJava 写入文件时,JNA内存访问无效 原因,我正在为C++ DLL编写一个JNA包装器(用GCC和MIW32编译),java,windows,jna,Java,Windows,Jna,write16字节.dll void write16Byte(const BYTE* mem) { FILE* out = fopen("BSTRvalues.txt", "a+"); if (out == NULL) { printf("Error opening file!\n"); return; } for (int i=0; i<16; i++) fprintf(out, "0x%x ", mem[i]); fwprintf(out, L"\n")
void write16Byte(const BYTE* mem) {
FILE* out = fopen("BSTRvalues.txt", "a+");
if (out == NULL) {
printf("Error opening file!\n");
return;
}
for (int i=0; i<16; i++) fprintf(out, "0x%x ", mem[i]);
fwprintf(out, L"\n");
fclose(out);
}
调用fprintf会导致“java.lang.Error:无效内存访问”,因为当我删除fprintf时,一切正常(我已经读入了线程)如果在编译器中打开警告(
-Wall
在gcc中),它会告诉您格式字符串和实际参数不匹配
“%x”
需要一个int
参数;您提供的是常量字节
。通常我认为这只会产生垃圾,但根据CPU、arch和堆栈布局,可能会出现一系列故障
您需要将
mem[i]
强制转换为int
(或使用与const BYTE
兼容的格式)。调用函数write16字节
时,您将向其传递什么内存?内存版本=新内存(18);/*我还尝试了新内存(100000)*/version.setWideString(0,“10.0.001”);内存版本=新内存(18);/*我还尝试了新内存(100000)*/version.setWideString(0,“10.0.001”)`<代码>内存版本=新内存(18);//我还尝试了新内存(100000)version.setWideString(0,“10.0.001”)代码>您应该更新您的问题,以包括您的实际Java使用情况。我使用g++.exe-m32-Wall-DBUILD\u dll-O2-c write16Byte.dll-o write16Byte.o编译了dll
->没有警告或错误。接下来,我在C程序中调用了dll函数write16Byte=>无运行时错误。无论如何,我将fprint调用从fprintf(out,“0x%x”,mem[I])改为16字节的write16代码>至fprintf(输出,“%c”,内存[i])代码>=>无效的内存访问,因此我尝试了以下新代码:第一:for(int i=0;使用stdcall
调用约定创建您的库?如果是这样,当您访问函数时,堆栈将不正确,从而导致mem
的值无效。在这种情况下,您需要从StdCallLibrary
派生,而不是从库
派生。您忽略了一些内容,其中任何一项都是这样可能很重要。谁使用BUILD\u DLL
宏?使用g++编译将在没有extern“C”
的情况下损坏导出的函数名。
public interface W16BDll extends com.sun.jna.Library {
W16BDll INSTANCE = (W16BDll)com.sun.jna.Native.loadLibrary("write16Byte.dll", W16BDll.class);
void write16Byte(com.sun.jna.Memory version);
}