当前位置: 首页 > 面试题库 >

我应该如何为JNI加载本机库以避免UnsatisfiedLinkError?

范玄裳
2023-03-14
问题内容

我想在Ubuntu 8.10上使用JNI,并使用Eclipse和gcc(如果有风味,请在Ubuntu上使用标准版本)。

尽管make文件成功创建了库,但似乎无法加载我的库。

主要的Java类如下:

class Hello {
    public native void sayHello();

    static {
        System.loadLibrary("hello.so");
    }

    public static void main(String[] args) {
        Hello h = new Hello();
        h.sayHello();
    }
}

我的make文件就是这样;

    all : hello.so

hello.so : Hello.o
    gcc -shared -o hello.so Hello.o

Hello.o : Hello.c Hello.h
    gcc -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -c Hello.c -o Hello.o

Hello.h : Hello.class
    javah -jni Hello

clean :
    -del Hello.h
    -del Hello.o

其余的代码(Hello.c)看起来像是会想到的。

我得到的错误如下:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello.so in java.library.path

如果我使用显式路径:

System.loadLibrary("/home/gavin/Work/workspace/JNI/hello.so");

然后就可以了,但是如果可能的话,我宁愿不使用显式路径。


问题答案:

按照Pax,您应该将库路径设置为Java查找库的位置。您的库名称应为libhello.so。加载库的调用应为:

System.loadLibrary("hello");

常规库 名称 .so
引用了Linux库,并根据该名称进行加载。这是来自SWIG文档的有关Java中动态链接问题的链接,尽管您没有使用SWIG,但本节仍然适用。



 类似资料:
  • 问题内容: 我希望用户能够选择显示的订单结果(例如按年龄),并且我不想在从数据库中获取它们后对其进行排序。 显然,如果用户能够指定影响SQL命令的输入,则需要对其进行过滤,并且我通常会使用参数化,但是pysqlite似乎会忽略除值以外的任何参数。 下面的示例代码显示了不适用于的参数设置,以及使用字符串格式的解决方法,但这种方法容易受到SQL注入的攻击。 建议的解决方案是什么,以允许用户输入在不暴露

  • 对于与PropertyValueFactory相关的问题,许多回答(和评论)建议避免使用该类和其他类似类。使用这个类有什么问题?

  • 问题内容: 今天,我有一个同事建议我重构代码,以使用label语句控制通过我创建的2个嵌套的for循环的流。我以前从未使用过它们,因为我个人认为它们会降低程序的可读性。如果论点足够扎实,我愿意改变使用它们的想法。人们对标签陈述有何看法? 问题答案: 如果您可以跳过两个循环(或一个包含switch语句的循环),则许多算法的表达会更容易。不要为此感到难过。另一方面,它可能表明解决方案过于复杂。因此,退

  • 问题内容: 有时是有用的,例如,如果我为网站上的所有链接(例如选择器)定义了通用样式,但是当我要覆盖某些规则时,可以有以下选择: 使用更具体(更长)的选择器 采用 哪种方法更好,可能有一些指导原则? 问题答案: 使用非常,非常谨慎- 它会覆盖刚才的一切,甚至是内联样式和混乱在低于显而易见的方式与样式规则“梯级”,让CSS的名字。它很容易使用不当,而且容易成倍增加,尤其是在滥用时。您可以轻松地得出一

  • 问题内容: 我读到应该避免赞成和。我对弄乱Loop并没有信心,也没有完全理解Codex。 下面的代码是否使用?如果是,并且由于应该避免,那么您能建议一种不使用但仍然完成相同任务的方法吗? 此代码用于按随机或按价格对帖子进行排序。 。 使用此代码将链接A(随机)和链接B(价格)发布在我的菜单中。因此,网站的访问者只需单击链接即可对帖子进行排序。 问题答案: 我已经针对WPSE这个主题做了非常详细的解