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