java - 写入文件时JNA无效的内存访问

标签 java windows jna

出于调试原因,我正在为 C++ DLL(使用 gcc 和 mingw32 编译)编写一个 jna 包装器

写入16Byte.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:无效的内存访问”,因为当我删除 fprintf 时一切正常(我已经阅读了 JNA Invalid memory access when writing to stdout 中的线程)

最佳答案

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

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

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

关于java - 写入文件时JNA无效的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19428851/

相关文章:

java - JNA如何在要传递给 native 库的结构中填充指向结构的指针字段?

库中的java权限

java - JNA(Java): How to pass an array of pointers to struct?

java - Java 中的子类型会导致意外的输出

Java JComboBox 抑制更改监听器

java - JScrollBar 什么都不做

windows - GIT将资源共享到多个存储库

windows - 如何获取硬盘访问的跟踪文件?

c# - 比较 Ink 序列化格式的签名

java - ToStringBuilder append X appendSuper