[英]Intptr, Intptr.Zero and ref int in java equivalent :
我在读取通过USB连接的扫描仪时遇到问题。 方法(LSConnect)的返回值始终与“找不到设备”相同。 通过阅读.NET中的示例,我发现他们使用了其他参数,如IntPtr,IntPtr.Zero,ref Int ...,我必须在Java中使用JNA来读取本机代码。
因此,这是C#中的LSApi.dll文档示例:
[DllImport(@"lsapi.dll")]
internal extern static int LSConnect(int hWnd, int hInst, short Peripheral,ref short hConnect); internal extern static int LSDocHandle (short hConnect, int hWnd, short Stamp, short Validate, short CodeLine,byte Side,short ScanMode,short Feeder,short Sorter, short WaitTimeout,short Beep,ref int NrDoc,short Reserved1,int Reserved2);
但是当我看到他们以前在.NET上所做的事情时:1 /声明:
public static extern int LSConnect(IntPtr hwnd, IntPtr HInst, int Peripheral, ref int hConnect);
public static extern int LSDocHandle(int hConnect,
IntPtr hWnd,
int Stamp,
int Validate,
int CodeLine,
char Side,
int ScanMode,
int Feeder,
int Sorter,
int WaitTimeout,
int Beep,
ref uint NrDoc,
int Reserved1,
int Reserved2);
2 /主要总是在.Net中:
int b = -2;
uint c = 0;
IntPtr frontimg = IntPtr.Zero;
IntPtr backimg = IntPtr.Zero;
IntPtr R1 = IntPtr.Zero;
IntPtr R2 = IntPtr.Zero;
LsApi.LSConnect(IntPtr.Zero, IntPtr.Zero, 502, ref b);
LsApi.LSDocHandle(b, IntPtr.Zero, LsApi.NO_STAMP, LsApi.NO_PRINT_VALIDATE, (int)LsApi.Codeline.NO_READ_CODELINE, (char)LsApi.Side.SIDE_FRONT_IMAGE, (int)LsApi.ScanMode.SCAN_MODE_COLOR_100, LsApi.AUTO_FEED, (int)LsApi.Sorter.SORTER_BAY1, LsApi.WAIT_NO, (int)LsApi.Beep.NO_BEEP, ref c, 0, 0).ToString();
LsApi.LSReadImage(b, IntPtr.Zero, LsApi.CLEAR_ALL_BLACK, (char)LsApi.Side.SIDE_FRONT_IMAGE, 0, 0, ref frontimg, ref backimg, ref R1, ref R2);
LsApi.LSDisconnect(b, IntPtr.Zero);
我用Doc Example中提到的方式在JAVA中声明了我的Method,它在C#中,但是我认为正确的方法是遵循.Net Example
这是我的JAVA代码:
public int LSConnect(int hWnd, int hInst, short i, ShortByReference hConnect);
public int LSDisconnect(short hConnect, IntByReference hWnd);
public int LSDocHandle(short hConnect, int hWnd, short Stamp,
short Validate, short CodeLine, byte Side, short ScanMode,
short Feeder, short Sorter, short WaitTimeout, short Beep,
IntByReference NrDoc, short Reserved1, int Reserved2);
和主要阶层:
public class ConnectExample {
public static void main(String[] args) {
String libName = "lsApi";
JNAUser32 jnaUser32 = (JNAUser32) Native.loadLibrary(libName,
JNAUser32.class);
ShortByReference hConnect = new ShortByReference();
hConnect.setValue((short) 55);
int state = jnaUser32.LSConnect(0, 0, (short) 502, hConnect);
System.out.println(state);
}
}
我只使用了LSConnect示例,因为:1-我必须将返回值表示为“ -1”,这表示连接正常2-我不知道等效于IntPtr,IntPtr.Zero和ref int的其他参数的等效项? 我对IntPtr和ref int都使用了intByReference。
显然, com.sun.jna.Pointer
类与IntPtr
等效。
对于ref int
, IntByReference
应该很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.