java - Linux,java.lang.UnsatisfiedLinkError : no "library file" in java. library.path

标签 java c++ linux java-native-interface unsatisfiedlinkerror

我正在尝试运行一个简单的 JNI 示例,我在其中运行一个通过动态库调用 C++ 函数的 Java 应用程序。

我将发布我使用的以下代码和终端命令。

.java

public class Lab{
   public native void hello();

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

   public static void main(String args[]) {
      new Lab().hello();
   }
}

通过终端获取.class和头文件

javac Lab.java
javah -jni Lab

你好.cpp文件

#include "Lab.h"
#include <stdio.h>
#include <iostream>

JNIEXPORT void JNICALL Java_Lab_hello(JNIEnv *env,jobject jobj) {
   cout<<"Hello World"<<endl;
}

生成lib文件“hello.so”:

gcc -shared -fpic -o hello.so -I/usr/lib/jvm/jdk1.8.0_45/include -I/usr/lib/jvm/jdk1.8.0_45/include/linux hello.cpp

最后运行文件:

java -Djava.library.path=. Lab

然后我得到错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at Lab.<clinit>(Lab.java:6)

我知道还有其他帖子也有同样的问题,但不幸的是,这些解决方案都不适合我。 我已经尝试过这样的事情:

  • 将hello.so文件复制到java lib路径下的“/usr/lib”中,并用chmod赋予权限;
  • 同时使用 export 将 hello.so 文件路径添加到 $LD_LIBRARY_PATH;
  • 运行java文件时添加hello.so路径(java -Djava.library.path="/root/Desktop"Lab);
  • 使用甚至不起作用的 ldconfig。

我需要在一个主要的应用程序上使用它,但我只是在尝试一个简单的例子,即使使用我在其他帖子中阅读的所有解决方案,我也无法让它工作。

谢谢。

最佳答案

搜索 Stack 的另一天,找到了我需要的东西 here . 在 Linux 上,.so lib 文件必须具有前缀“lib”。因此,在我的示例中,我的 lib 文件应命名为 libhello.so 而不是 hello.so 并且一切正常。

关于java - Linux,java.lang.UnsatisfiedLinkError : no "library file" in java. library.path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35346169/

相关文章:

c - 为什么使用 timer_settime() 会影响 sleep() 函数

java - 如何根据单词范围检查输入单词的位置?

java - SQL 开发人员 : How do I increase the 'SQL Array Fetch Size' greater than the max. 500?

java - 如何正确分离生产类和模型类

c++ - c++ 中的 friend 是相互的吗?

正则表达式删除 block 注释也删除 * 选择器

java - Xposed - 如何 Hook 私有(private)静态方法

c++ - 为什么编译器会提示对齐?

c++ - 带有字符而不是字节的 substr

linux - 将 16 位标识符替换为新标识符