4

出于调试原因,我正在为 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 包装器

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: Invalid memory access”,因为当我删除 fprintf 时一切正常(我已经在 J​​NA Invalid memory access 中读取了写入 stdout 时的线程)

4

1 回答 1

0

如果您在编译器中打开警告(-Wall在 gcc 中),它会告诉您您的格式字符串和实际参数不匹配。

"%x"需要一个int参数;你提供const BYTE. 通常我希望这只会产生垃圾,但根据 CPU、拱门和堆栈布局,您可能会遇到一系列故障。

您需要转换mem[i]int(或使用与 兼容的格式const BYTE)。

于 2013-10-18T10:12:34.897 回答