我正在使用JNA和使用Jnaerator生成的代码调用dll。其中一种方法需要一个字符串,JNA签名需要一个ByteBuffer。
我尝试将ByteBuffer分配为直接(ByteBuffer.allocateDirect)和间接(ByteBuffer.wrap),但在两种情况下有时到达dll的字符串都有其他随机字符(例如ReceiptÚeœ )。原始字节[]在那里(收据= 52 65 63 65 69 70 74),但也有可变数量的附加随机字节(01 da 65 9c 19)。随机字符串是正确的,没有额外的字节。
我已经尝试使用BridJ代替JNA的等效代码(方法签名接受指针名称),在这种情况下它可以正常工作。不幸的是我无法切换到BridJ,因为我需要使用com.sun.jna.platform.win32类,除非我可以为那些类生成BridJ替换(https://stackoverflow.com/questions/31658862/jnaerator-bridj-user32-missing-methods)
原生声明:
HRESULT extern WINAPI WFSOpen ( LPSTR lpszLogicalName, HAPP hApp, LPSTR lpszAppID,DWORD dwTraceLevel, DWORD dwTimeOut, DWORD dwSrvcVersionsRequired, LPWFSVERSION lpSrvcVersion, LPWFSVERSION lpSPIVersion, LPHSERVICE lphService);
JNAerator JNA代码:
//works
@Deprecated
NativeLong WFSOpen(Pointer lpszLogicalName, Pointer hApp, Pointer lpszAppID, int dwTraceLevel, int dwTimeOut, int dwSrvcVersionsRequired, WFSVERSION lpSrvcVersion, WFSVERSION lpSPIVersion, ShortByReference lphService);
//does not work
NativeLong WFSOpen(ByteBuffer lpszLogicalName, Pointer hApp, ByteBuffer lpszAppID, int dwTraceLevel, int dwTimeOut, int dwSrvcVersionsRequired, WFSVERSION lpSrvcVersion, WFSVERSION lpSPIVersion, ShortBuffer lphService);
Java调用工作(但已弃用)
Pointer m = new Memory(string.length() + 1); // WARNING: assumes ascii-only string
m.setString(0, string);
MsxfsLibrary.INSTANCE.WFSOpen(lpszLogicalName, lphApp.getValue(), lpszAppID, dwTraceLevel, dwTimeOut, dwSrvcVersionsRequired, lpSrvcVersion, lpSPIVersion, lphService);
Java调用NOT工作测试A:
lpszLogicalName = ByteBuffer.wrap(bytes);
MsxfsLibrary.INSTANCE.WFSOpen(lpszLogicalName, lphApp.getValue(), lpszAppID, dwTraceLevel, dwTimeOut, dwSrvcVersionsRequired, lpSrvcVersion, lpSPIVersion, lphService);
Java调用NOT工作测试B:
byte[] bytes = string.getBytes();
return ByteBuffer.wrap(bytes);
ByteBuffer bb = ByteBuffer.allocateDirect(bytes.length);
bb.put(bytes);
lpszLogicalName = bb.position(0);
msxfsLibrary.WFSOpen(lpszLogicalName, lphApp.getValue(), lpszAppID, dwTraceLevel, dwTimeOut, dwSrvcVersionsRequired, lpSrvcVersion, lpSPIVersion, lphService);
答案 0 :(得分:0)
如果你指的是_wfsopen(),那就是期待一个宽字符串。使用WString
,或将您的资源库配置为输入地图String
(请参阅W32APIOptions.UNICODE_OPTIONS
)。
答案 1 :(得分:0)
我认为发生的事情是您传递的是包含字符串的字节数组,但它不是以空字符结尾的字符串。您应该创建一个具有额外位置的字节数组。将las位置设置为0并将字符串复制到该字节数组中。