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() 而不指定编码通常不是一个好主意。