JNI UnsatisfiedLinkError-如何正确加载库?

时间:2012-08-12 17:50:11

标签: dll java-native-interface loadlibrary unsatisfiedlinkerror

我正在尝试使用CardScan SDK中的Java示例数据库程序。

我正在处理位于Java / JNI和Java / Database中的文件。该程序必须使用32位JRE运行。通过卸载Java并安装32位版本,然后重新添加Java的系统路径,我能够在64位计算机上完成此操作。我可以通过双击SDKData.bat文件成功运行程序并与CardScan数据库文件(.cdb)接口,但是当我打开源文件进行编辑并编辑Java.library.path以包含所需的库(CRTK_JNI)时.dll),我到处都得到UnsatisfiedLinkErrors:

  

线程“main”中的异常java.lang.UnsatisfiedLinkError:sdkdata.CRTK.CRTK_Init([I] I
      at sdkdata.CRTK.CRTK_Init(Native Method)
      在sdkdata.CRTK。(CRTK.java:239)
      在sdkdata.SDKData。(SDKData.java:97)
      在sdkdata.SDKData.main(SDKData.java:643)
  Java结果:1

据推测,这种情况正在发生,因为库未正确加载。

我需要做什么才能以满负荷运行和编辑程序(CRTK_JNI中的所有本机功能都处于正常工作状态)?

2 个答案:

答案 0 :(得分:2)

  

可能这种情况正在发生,因为库没有正确加载。

恰恰相反。库加载完成。你没有从System.load()/loadLibrary()调用得到这个,你在调用你的本地方法时会收到错误,这个方法应该有签名:

package sdkdata;

public class CRTK
{
  public native int CRTK_Init(int[]);
}

所以它不在那里,或者您在没有重新生成.h和.c文件的情况下更改了签名,或者您已经以其他方式手动破坏了声明。

发布您的代码。

答案 1 :(得分:0)

为了澄清,这个Java示例程序正式不受CardScan API支持 - 尝试使用不受支持的语言的API仅仅依赖于实验性实现是一个坏主意。我最终使用了一种支持的语言(Visual Basic)来使用SDK;如果有人在看这个问题时碰巧使用CardScan API,here是我在Github上的VB实现。