2016-04-28 2 views
0

Я знаю, что есть аналогичные вопросы по этой теме, но ни один из ответов не может решить мою проблему:Ошибка при использовании JNI на Ubuntu: java.lang.UnsatisfiedLinkError: нет ... в java.library.path

I есть Java-файл:

class hjni { 

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

    private native void print(); 

    public static void main(String[] args) { 
     new hjni().print(); 
    } 
} 

Я использую следующие для компиляции и генерации файлов заголовка:

javac hjni.java 
javah -jni hjni 

Вот файл C++:

#include <jni.h> 
#include <stdio.h> 
#include "hjni.h" 

JNIEXPORT void JNICALL 
Java_hjni_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello World!\n"); 
    return; 
} 

Я скомпилировать файл C++:

g++ -fPIC -shared -I/usr/lib/jvm/java-7-openjdk-amd64/include -I/usr/lib/jvm/java-7-openjdk-amd64/include/linux hjni.cpp -o hjni.so 

Файлы hjni.class, hjni.h и hjni.so все созданное.

я запускаю файл Java:

java -Djava.library.path=. hjni 

Здесь ошибка я получаю:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no hjni in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1889) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:849) 
    at java.lang.System.loadLibrary(System.java:1088) 
    at hjni.<clinit>(hjni.java:4) 

Я использую java -XshowSettings:properties проверить java.library.path:

java.library.path = /usr/java/packages/lib/amd64 
     /usr/lib/x86_64-linux-gnu/jni 
     /lib/x86_64-linux-gnu 
     /usr/lib/x86_64-linux-gnu 
     /usr/lib/jni 
     /lib 
     /usr/lib 

Интересно, что папка

/usr/java/packages/lib/amd64 

не существует:

cd /usr/java/packages/lib/amd64 
bash: cd: /usr/java/packages/lib/amd64: No such file or directory 

я мог бы найти общую библиотеку (libjli.so) здесь:

/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 

, когда я добавляю по указанному выше пути по

export LD_LIBRARY_PATH=/usr/lib/jvm/java-7-openjdk-amd64/lib/amd64/jli 

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

ответ

1

Когда вы делаете System.loadLibrary("hjni") Java будет искать файл под названием libhjni.so. Вызовите System.mapLibraryName(libname), чтобы узнать, каким должно быть имя файла для данной библиотеки. К сожалению, Javadoc для mapLibraryName утверждает, что имя будет отображаться на имя, зависящее от платформы, но не то, что правила для создания этого имени файла. Это <name>.dll для Windows, lib<name>.so для Linux и lib<name>.jnilib для Mac OS X, но я не могу найти ссылку для этого прямо сейчас.

Если вы переименуете свой файл, все будет работать.

Смежные вопросы