我已经通过stackoverflow和互联网搜索了这个,还没有找到答案。
我有一个指纹读取器的 SDK,但我没有源代码,这意味着我无法更改它。
它有一些我需要访问的方法,我将在下面列出哪些接口(来自 RS_API.h):
REALSCANSDK_API int __stdcall RS_InitSDK( const char* configFileName, int option, int* numOfDevice );
REALSCANSDK_API int __stdcall RS_InitDevice( int deviceIndex, int*deviceHandle );
REALSCANSDK_API int __stdcall RS_SetCaptureMode( int deviceHandle, int captureMode, int captureOption, bool withModeLED );
REALSCANSDK_API int __stdcall RS_SetViewWindow( int deviceHandle, HWND windowHandle, RECT drawRectangle, bool autoContrast );
REALSCANSDK_API int __stdcall RS_TakeImageDataEx( int deviceHandle, int timeout, int fingerIndex, bool withLED, unsigned char** imageData, int* imageWidth, int* imageHeight );
我设法将它们全部转换为 Delphi,但我也想从 Java 应用程序访问它。
我的原型是这样的:
public class Leitor {
public native int RS_InitSDK(String configFileName, int option, int numOfDevice );
public static void main(String[] args) {
Leitor leitor= new Leitor();
leitor.RS_InitSDK(null, 0, 0);
}
static
{
System.load("C:\\temp\\SDKSuprema\\SDK\\RS_SDK.dll");
}
}
加载位工作正常(我相信这意味着它可以找到 dll 文件),但是当它运行本机方法时会抛出异常:
线程“main”中的异常 java.lang.UnsatisfiedLinkError: leitor.Leitor.RS_InitSDK(Ljava/lang/String;II)I at leitor.Leitor.RS_InitSK(Native Method) at leitor.Leitor.main(Leitor.java:14)
如果我重命名 dll,它会将错误更改为“无法加载库”,所以我认为问题在于方法的映射。
我也找不到如何映射要从 Java 调用的通过引用参数传递。唯一的解决方案是更改 dll 以返回结构而不是单个结果,但这是不可能的,因为我无法更改代码。
第二个问题是将窗口句柄从 swt 发送到 JNI 本机方法......
非常欢迎任何帮助!