Java 向字节数组传递引用的JNA无法正常工作

Java 向字节数组传递引用的JNA无法正常工作,java,memory-management,jna,Java,Memory Management,Jna,我的本机代码是: 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("JE

我的本机代码是:

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
并不总是正确的。有时会有比我想要的更多的魔术师(“绝地武士?78ê”)。 也许分配了比我想要的更多的内存。
我还试图传递一个普通字节[],但遇到了相同的问题

您遇到的问题是C字符串必须以null结尾。只需从
字符串
中获取字节,只会得到字符J、E、d、i和t。数组需要第六个字节的值为0才能正常工作

一种方法是保留您拥有的
指针
映射,自己分配额外的字节,然后使用以下命令将字节写入本机内存:

内存缓冲区=新内存(6);
//确保最后一个字节为0
memory.clear();//也可以只设置最后一个字节
buffer.setString(0,“JEdit”);
(请注意,这依赖于默认的平台编码,这通常不是一个好主意。您应该指定编码;在这种情况下,
US-ASCII
应该可以工作

除了
setString()
之外,还可以使用以0结尾的
byte[]
参数保持
write()

或者,如果要在函数中使用数组映射而不是
指针
,只需声明一个新数组:

//将所有元素初始化为0
字节[]appnameNullTerminated=新字节[appname.length+1];
System.arraycopy(appname,0,appname,0,appname.length);
或者,使用上面的命令,像现在一样写入终止的
字节[]
数组

同样,确保控制字符到字节的编码。使用
getBytes()
而不指定编码通常是个坏主意