出于调试原因,我正在编写一个用于C ++ DLL的jna包装器(使用gcc和mingw32编译)
write16Byte.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");
fclose(out);
}
jna wrapper
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);
}
fprintf的调用导致“java.lang.Error:无效的内存访问”,因为当我删除fprintf时一切正常(我已经阅读了JNA Invalid memory access when writing to stdout中的帖子)
答案 0 :(得分:0)
如果您在编译器中打开警告(gcc中的-Wall
),它会告诉您,您的格式字符串和实际参数不匹配。
"%x"
需要int
参数;您提供const BYTE
。通常情况下,我希望这只会产生垃圾,但根据CPU,拱门和堆栈布局,您可能会遇到一系列故障。
您需要将mem[i]
投射到int
(或使用与const BYTE
兼容的格式)。