Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 写入文件时,JNA内存访问无效 原因,我正在为C++ DLL编写一个JNA包装器(用GCC和MIW32编译)_Java_Windows_Jna - Fatal编程技术网

Java 写入文件时,JNA内存访问无效 原因,我正在为C++ DLL编写一个JNA包装器(用GCC和MIW32编译)

Java 写入文件时,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")

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");
  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);
}