JNA 传递对字节数组的引用不能正常工作
JNA passing Reference to Byte Array does not work correctly
我的本机代码是:
int xlSetApplConfig(
char *appName,
unsigned int appChannel,
unsigned int hwType,
unsigned int hwIndex,
unsigned int hwChannel,
unsigned int busType)
我试着用 Java 中的指针来表达 appName
,如下所示:
//integers..
byte[] appnamebyte = new String("JEdit").getBytes();
Pointer appname = new Memory(appnamebyte.length);
appname.write(0, appnamebyte, 0, appnamebyte.length);
int status = dll.INSTANCE.xlOpenPort(portHandle, appname, channelMask, permissionMask,
rxQueueSize,
xlInterfaceVersion, busType);
该函数正在将字节数组写入注册表或某处,并使用其他工具(给定的工具)我可以读取该值。
如果我开始我的代码没有错误,但 appname
并不总是正确的。有时有比我想要的更多的字符(“JEdit ?78ê”)。
也许以某种方式分配了比我想要的更多的内存。
我也尝试传递一个正常的 byte[] 但有同样的问题
您遇到的问题是 C 字符串必须以 null 结尾。简单地从 String
中获取字节只会得到字符 J、E、d、i 和 t。您的数组需要第六个字节的值为 0 才能正常工作。
一种方法是保留您拥有的 Pointer
映射并自己分配额外的字节,然后使用 Pointer.setString()
:
将字节写入该本机内存
Memory buffer = new Memory(6);
// make sure the last byte is 0
memory.clear(); // could also just set the last byte
buffer.setString(0, "JEdit");
(请注意,这依赖于默认平台编码,这通常不是一个好主意。您应该指定编码;在这种情况下 US-ASCII
应该有效。
而不是 setString()
你也可以保持 write()
像你一样,使用以 0 结尾的 byte[]
参数。
或者,如果您想在函数中使用数组映射而不是 Pointer
,只需声明一个新数组:
// initializes all elements to 0
byte[] appnameNullTerminated = new byte[appname.length+1];
System.arraycopy(appname, 0, appnameNullTerminated, 0, appname.length);
或者,使用上面的方法并像现在一样编写终止的 byte[]
数组。
同样,确保控制字符到字节的编码。使用 getBytes()
而不指定编码通常不是一个好主意。
我的本机代码是:
int xlSetApplConfig(
char *appName,
unsigned int appChannel,
unsigned int hwType,
unsigned int hwIndex,
unsigned int hwChannel,
unsigned int busType)
我试着用 Java 中的指针来表达 appName
,如下所示:
//integers..
byte[] appnamebyte = new String("JEdit").getBytes();
Pointer appname = new Memory(appnamebyte.length);
appname.write(0, appnamebyte, 0, appnamebyte.length);
int status = dll.INSTANCE.xlOpenPort(portHandle, appname, channelMask, permissionMask,
rxQueueSize,
xlInterfaceVersion, busType);
该函数正在将字节数组写入注册表或某处,并使用其他工具(给定的工具)我可以读取该值。
如果我开始我的代码没有错误,但 appname
并不总是正确的。有时有比我想要的更多的字符(“JEdit ?78ê”)。
也许以某种方式分配了比我想要的更多的内存。
我也尝试传递一个正常的 byte[] 但有同样的问题
您遇到的问题是 C 字符串必须以 null 结尾。简单地从 String
中获取字节只会得到字符 J、E、d、i 和 t。您的数组需要第六个字节的值为 0 才能正常工作。
一种方法是保留您拥有的 Pointer
映射并自己分配额外的字节,然后使用 Pointer.setString()
:
Memory buffer = new Memory(6);
// make sure the last byte is 0
memory.clear(); // could also just set the last byte
buffer.setString(0, "JEdit");
(请注意,这依赖于默认平台编码,这通常不是一个好主意。您应该指定编码;在这种情况下 US-ASCII
应该有效。
而不是 setString()
你也可以保持 write()
像你一样,使用以 0 结尾的 byte[]
参数。
或者,如果您想在函数中使用数组映射而不是 Pointer
,只需声明一个新数组:
// initializes all elements to 0
byte[] appnameNullTerminated = new byte[appname.length+1];
System.arraycopy(appname, 0, appnameNullTerminated, 0, appname.length);
或者,使用上面的方法并像现在一样编写终止的 byte[]
数组。
同样,确保控制字符到字节的编码。使用 getBytes()
而不指定编码通常不是一个好主意。