UnsatisfiedLinkError: нет libhello в java.library.path - PullRequest
0 голосов
/ 09 января 2019

Я делаю учебник о JNI, чтобы освоиться с ним для моего проекта. Тем не менее, я застрял в этой части учебника, в котором выполняется Java-программа. Я использую Eclipse, где я создал проект Java и поместил файлы в пакет. Когда я пытаюсь следовать руководству без использования Eclipse, я не получаю ошибок, поэтому я предполагаю, что это проблема, связанная с путем.

Что касается моей ошибки, я получаю

UnsatisfiedLinkError: нет libhello в java.library.path

когда я запускаю это в моем терминале:

java -Djava.library.path=. helloJNI.HelloJNI

Даже когда я указываю свой путь, он не работает. Если вы хотите воспроизвести мои шаги, вот что я сделал:

  1. После создания HelloJNI.java я запустил в терминале следующее:

    javac -h . HelloJNI.java
    

Эта команда создала сгенерированный файл заголовка, указанный ниже.

  1. После этого я написал HelloJNI.c, перешел в папку пакета и затем скомпилировал ее с помощью этой команды в том же каталоге:

     gcc -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libhello.so HelloJNI.c
    
  2. Затем я переместился на один каталог вверх по ~/eclipse-workspace/HelloJNI/src и выполнил эту команду:

     java -Djava.library.path=. HelloJNI
    

Что приводит к ошибке, описанной выше.

Вот мой код:

HelloJNI.java

package helloJNI;

public class HelloJNI {  // Save as HelloJNI.java
       static {
          System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
                                       //  at runtime
                                       // This library contains a native method called sayHello()
       }

       // Declare an instance native method sayHello() which receives no parameter and returns void
       private native void sayHello();

       // Test Driver
       public static void main(String[] args) {
          new HelloJNI().sayHello();  // Create an instance and invoke the native method
       }
    } 

HelloJNI.c

// Save as "HelloJNI.c"
#include <jni.h>        // JNI header provided by JDK
#include <stdio.h>      // C Standard IO Header
#include "helloJNI_HelloJNI.h"   // Generated

// Implementation of the native method sayHello()
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
   printf("Hello World!\n");
   return;
}

helloJNI_HelloJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class helloJNI_HelloJNI */

#ifndef _Included_helloJNI_HelloJNI
#define _Included_helloJNI_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     helloJNI_HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_helloJNI_HelloJNI_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif 

Я также попытался установить путь к своему рабочему каталогу, но я все еще получаю тот же результат. Что я делаю не так?

1 Ответ

0 голосов
/ 09 января 2019

Я переместился на один каталог вверх к ~/eclipse-workspace/HelloJNI/src

Это означает, что ваш libhello.so находится в каталоге ~/eclipse-workspace/HelloJNI/src/helloJNI, не так ли?

Теперь, чтобы позволить Java найти эту библиотеку, запустите

java -Djava.library.path=helloJNI helloJNI.HelloJNI

или используйте абсолютный путь

java -Djava.library.path=~/eclipse-workspace/HelloJNI/src/helloJNI helloJNI.HelloJNI
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...