【问题标题】:JNI UnsatisfiedLinkError- how do I load libraries correctly?JNI UnsatisfiedLinkError-如何正确加载库?
【发布时间】:2012-08-12 17:50:10
【问题描述】:

我正在尝试使用 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
在 sdkdata.CRTK.CRTK_Init(本机方法)
在 sdkdata.CRTK.(CRTK.java:239)
在 sdkdata.SDKData.(SDKData.java:97)
在 sdkdata.SDKData.main(SDKData.java:643)
Java 结果:1

这可能是因为库没有正确加载。

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

【问题讨论】:

  • 那么,库中有哪些未绑定的符号?
  • @DonalFellows 以下是我认为未绑定的所有内容:pastebin.com/5vsxty5e
  • 您不要将 DLL 放入 java.library.path。您放置包含 DLL 的目录。
  • @bmargulies 我明白这一点。我在 java.library.path 中有目录,而不是 DLL。抱歉,如果不清楚。
  • 使用 dumpbin /imports 查看您的 DLL 是否需要其他 DLL。如果是这样,它们必须在 PATH 中——java.library.path 不够好。

标签: dll java-native-interface loadlibrary unsatisfiedlinkerror


【解决方案1】:

这可能是因为库没有正确加载。

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

package sdkdata;

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

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

发布您的代码。

【讨论】:

  • 我确实发布了我的代码,但由于某种原因它被版主编辑掉了。可能应该更多地关注问题规则,对此感到抱歉。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多