首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从Linux上的UnsatisfiedLinkError启动.jar时,Java和共享库

当从Linux上的UnsatisfiedLinkError启动.jar时,Java和共享库
EN

Stack Overflow用户
提问于 2011-05-14 13:37:20
回答 1查看 3.5K关注 0票数 1

最终解决方案可以在对已接受的答案的注释中找到。感谢bmargulies

嘿伙计们,

我有一个很奇怪的错误,我不知道原因。下面是设置:我正在用Java构建一个独立于平台的音乐播放器。作为本机声音库,我使用的是irrKlang引擎( http://www.ambiera.com/irrklang/ ),它分别作为一组用于Windows、Linux和MacOS的共享库。由于这些库是用C++编写的,所以我构建了一个作为包装器的共享库(也是在C++中,但使用了extern "C“等等),并为每个需要的操作系统编译了这些库。我现在使用JNA的包装器。我正在使用eclipse,所有需要的库都在项目的主文件夹(当前工作目录)中抵抗。现在出现了一个问题:如果我在eclipse上运行我的Java应用程序,甚至在项目的主文件夹中构建一个.jar并在那里执行它,那么一切都很好。但特别是在Linux上,当我打包时(通常是工作的!)应用程序到.jar中,我得到以下错误:

代码语言:javascript
复制
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: Unable to load library 'IrrklangWrapper': libIrrKlang.so: cannot open shared object file: No such file or directory
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236)
at com.sun.jna.Library$Handler.<init>(Library.java:140)
at com.sun.jna.Native.loadLibrary(Native.java:379)
at com.sun.jna.Native.loadLibrary(Native.java:364)
at Demo.<init>(Demo.java:29)
at Demo.main(Demo.java:55)
... 5 more

"IrrKlangWrapper“是我自己的共享库,"libIrrKlang.so”是由它包装的库。所以JNA能够找到我的图书馆,但我的图书馆却找不到包装好的图书馆。奇怪!特别是因为如果我直接启动项目(而不构建.jar),就不会发生这种情况。

因为有些人可能会问这个问题,这里还有用C++编写的代码--尽管我不认为问题的根源就在那里,因为错误是在调用包含的方法之前引发的:

代码语言:javascript
复制
#include <iostream>
#include <stdio.h>
#include <irrKlang.h>
#include <sys/stat.h>
#include <string>
#include <unistd.h>
using namespace std;

extern "C" {

int func(char *path) {
    cout << path << endl;

    irrklang::ISoundEngine* engine = irrklang::createIrrKlangDevice();
    engine->loadPlugins("./");
    cout << engine->getDriverName() << endl;
    engine->play2D(path);
    //Endless loop for testing. TODO: Remove
    while (true) {
    }
    engine->drop();

    return 0;
}
}

有人知道怎么解决这个问题吗?由于我的应用程序打算独立于平台,所以我无法将任何共享库复制到特定的文件夹中--它们必须驻留在我的应用程序的(子)文件夹中。

提前谢谢你,

安德雷

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-14 13:40:35

在Linux上,您需要设置LD_LIBRARY_PATH以包含包含第二个共享库的目录。

这个要求很难绕开。LD_LIBRARY_PATH只在java进程开始时由ld.so读取。你以后不能再加进去了。

您必须创建一个大的共享库,这意味着要找到依赖项的.a版本才能合并到其中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6002170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档