2012-08-12 159 views
0

我正在尝试使用CardScan SDK中的Java示例数据库程序。JNI UnsatisfiedLinkError-如何正确加载库?

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

Exception in thread "main" java.lang.UnsatisfiedLinkError: sdkdata.CRTK.CRTK_Init([I)I
at sdkdata.CRTK.CRTK_Init(Native Method)
at sdkdata.CRTK.(CRTK.java:239)
at sdkdata.SDKData.(SDKData.java:97)
at sdkdata.SDKData.main(SDKData.java:643)
Java Result: 1

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

我需要做什么才能以满负荷运行和编辑程序(使用来自CRTK_JNI的所有原生函数的工作顺序)?

+0

那么,库中有什么非绑定符号? – 2012-08-12 18:02:11

+0

@DonalFellows以下是我认为不受限制的所有内容: http://pastebin.com/5vsxty5e – blastb 2012-08-12 18:18:22

+1

您不会将DLL放入java.library.path中。你把包含DLL的目录。 – bmargulies 2012-08-12 20:34:21

回答

0

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

2

Presumably this is happening because the library is not loading properly.

恰恰相反。库加载完成。你没有得到的是从System.load()/loadLibrary()电话,你在呼唤你的本地方法时收到错误,应该有签名的一个:

package sdkdata; 

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

所以它不存在,或者您已经更改了签名无需重新生成.h和.c文件,或者您已经以其他方式手动修改了声明。

发布您的代码。

+0

我确实发布了我的代码,但由于某种原因它被编辑者删除了。可能应该更多关注问题规则,对此很抱歉。 – blastb 2013-01-22 20:57:55