Java 映射c++;具有JNA的函数 我试图用JNA映射这个C++函数有问题。< /P>

Java 映射c++;具有JNA的函数 我试图用JNA映射这个C++函数有问题。< /P>,java,c++,dll,jna,Java,C++,Dll,Jna,我尝试在java中使用这些映射,但不起作用: short cnc_rdexecprog(short FlibHndl, ShortByReference length, ShortByReference blknum, String data); short cnc_rdexecprog(short FlibHndl, ShortByReference length, ShortByReference blknum, Pointer data); short cnc_rdexecprog(sho

我尝试在java中使用这些映射,但不起作用:

short cnc_rdexecprog(short FlibHndl, ShortByReference length, ShortByReference blknum, String data);
short cnc_rdexecprog(short FlibHndl, ShortByReference length, ShortByReference blknum, Pointer data);
short cnc_rdexecprog(short FlibHndl, ShortByReference length, ShortByReference blknum, Memory data);
第一个映射有效,但返回与我发送的字符串相同的字符串,第二个和第三个映射显示此错误:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Invalid memory access
多亏了这个线程,我才能够实现类似的功能:


我认为问题出在输出参数“char*data”中。如何映射此函数?

类型需要字节缓冲区(C中的字符)

Java的
String
类型是不可变的(
constchar*
),因此本机代码无法修改它,正如您所观察到的。
指针
类型可以工作,但正如您从错误消息中看到的,指针并不指向已分配的内存<代码>内存也可以工作(并扩展
指针
),但要求您实际使用参数分配内存。例如:

Memory buffer = new Memory(bufferSize);
您可以将
缓冲区
作为
指针
内存
传递给您的方法,它将工作

这里的问题是确定
bufferSize
的值应该是多少。这有助于告诉您:

长度[in/out]指定显示的变量的地址 要读取的字符数。将字符数设置为 读取此变量*长度(length)。阅读后,阅读的数量 实际读取的字符在此变量*长度(length)中设置 再说一遍

您需要协调缓冲区的大小和在第二个参数中传递的长度。请参阅文档,查看是否有任何常量定义您期望的字符串的最大长度,并使用该常量。(根据,它可能是
MAX_PROG_SIZE
(1024*2),并为空终止符添加了一个额外的字节。但您应该自己验证这一点。)

如果不存在,标准的JNA习惯用法是:

  • 声明大小并将其传递给本机函数(长度和分配的缓冲区应匹配)
  • 检查结果代码是否表明您没有提供足够的字符(可能是
    EW_LENGTH
    (2))
  • 使用较大的缓冲区重复此操作,直到字符串合适为止
或者,您可以从一个更大的值开始


在所有情况下,请记住在实际最大字符串长度中添加1以说明空终止符。

字符类型需要字节缓冲区(C中的字符)

Java的
String
类型是不可变的(
constchar*
),因此本机代码无法修改它,正如您所观察到的。
指针
类型可以工作,但正如您从错误消息中看到的,指针并不指向已分配的内存<代码>内存也可以工作(并扩展
指针
),但要求您实际使用参数分配内存。例如:

Memory buffer = new Memory(bufferSize);
您可以将
缓冲区
作为
指针
内存
传递给您的方法,它将工作

这里的问题是确定
bufferSize
的值应该是多少。这有助于告诉您:

长度[in/out]指定显示的变量的地址 要读取的字符数。将字符数设置为 读取此变量*长度(length)。阅读后,阅读的数量 实际读取的字符在此变量*长度(length)中设置 再说一遍

您需要协调缓冲区的大小和在第二个参数中传递的长度。请参阅文档,查看是否有任何常量定义您期望的字符串的最大长度,并使用该常量。(根据,它可能是
MAX_PROG_SIZE
(1024*2),并为空终止符添加了一个额外的字节。但您应该自己验证这一点。)

如果不存在,标准的JNA习惯用法是:

  • 声明大小并将其传递给本机函数(长度和分配的缓冲区应匹配)
  • 检查结果代码是否表明您没有提供足够的字符(可能是
    EW_LENGTH
    (2))
  • 使用较大的缓冲区重复此操作,直到字符串合适为止
或者,您可以从一个更大的值开始

在所有情况下,请记住在实际最大字符串长度中添加1以说明空终止符