【问题标题】:jna load libraryjna 加载库
【发布时间】:2011-07-25 10:29:14
【问题描述】:

我在使用 jna 加载 dll 时遇到问题。虽然我可以在 Eclipse 中调试代码,但当我将其导出并作为 jar 文件运行时会出现异常:

java.lang.UnsatisfiedLinkError: 无法加载库“SiUSBXp”

任何想法为什么当我将它作为 jar 文件运行时它找不到我的 dll?

谢谢!!!!

public interface SiUSBXp extends StdCallLibrary {
    byte SI_GetNumDevices(IntByReference numdevices);
    byte SI_GetProductString( int deviceNum, byte[] productString, int options );
    byte SI_Open(IntByReference numdevices);
}

static SiUSBXp INSTANCE;

public static void main(String[] args) {
    System.setProperty("jna.library.path","SiUSBXp.dll");
    HashMap<String, StdCallFunctionMapper> optionMap = new HashMap<String, StdCallFunctionMapper>();
    StdCallFunctionMapper myMapper = new StdCallFunctionMapper();
    optionMap.put(Library.OPTION_FUNCTION_MAPPER, myMapper);
    INSTANCE = (SiUSBXp) Native.loadLibrary("SiUSBXp", SiUSBXp.class, optionMap);
}

------------------ 编辑 ----------------------

dll 与 jar 位于同一文件夹中

------------------ 编辑 2 ---------

我刚刚尝试在 windows xp 中运行它,它可以工作.. 但它不能在 windows 7(64 位)中运行

------------------ 编辑 3 --------------------- 我已经解决了这个问题......这是由于安装了java版本......我把它们都删除了,然后只安装了x86版本的java......之后它就完美运行了

【问题讨论】:

  • 从 jar 运行时 SiUSBXp.dll 在哪里?

标签: java dll load jna


【解决方案1】:

将 DLL 放入“当前文件夹”或系统变量 PATH,或使用-Djna.library.path=(path to the dll) 作为 VM 开关而不是硬编码。

【讨论】:

  • 注意 jna.library.path 的搜索方式与 PATH 相同;不要在其中列出的路径中包含 DLL 名称。您可以在代码中设置 jna.library.path,只要在尝试加载本机库之前进行设置即可。
  • 如果这不起作用,还有什么可以尝试的吗?我在同一条船上,设置 JNA 路径没有帮助。
  • 在 Windows 上,JNA 首先搜索 jna.library.path 上的 DLL,然后回退到搜索 PATH 的系统。有时 DLL 将无法加载,因为它所依赖的 DLL 不在任一路径上,请使用“depends.exe”来跟踪这些依赖关系。
  • 另外,如果您的 .so 文件调用任何其他库,您需要设置环境变量 LD_LIBRARY_PATH 以指定找到它们的目录。然后您的 .so 文件也必须使用“g++ -Wall -shared -fPIC -o libexample.so example.cpp -Wl,-rpath=. -L. -lfoo”构建,其中 foo 是相关的可共享对象库。指定 example.cpp 调用的所有库。
猜你喜欢
  • 2011-09-02
  • 2011-10-17
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多