Проблема JNI в Linux: не удается открыть общий объектный файл - PullRequest
9 голосов
/ 02 сентября 2011

Я видел этот вопрос здесь, пробовал предлагаемые исправления, но пока мне это не удалось. У меня есть некоторый опыт работы с Java, но JNI давно, никогда не делал этого в Linux, хотя ...

Я пытаюсь запустить простое приложение HelloWorld JNI в Linux.

Небольшой Java-файл:

class HelloWorld {

    private native void print();

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

    static {
        System.out.println(System.getProperty("java.library.path"));
        System.loadLibrary("HelloWorld");
    }

}

Маленький файл C:

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

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

скомпилировал файл C:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so

Запустите приложение по:

java HelloWorld

или

java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld

Но ничего хорошего, получая:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory

Странно, потому что на самом деле есть файл /home/nxp40954/jnitesting/libHelloWorld.so.

У кого-нибудь есть подсказка?

Ответы [ 2 ]

8 голосов
/ 02 сентября 2011

выполнить следующим образом:

export LD_LIBRARY_PATH=.
java HelloWorld

java.lang.UnsatisfiedLinkError генерируется, когда файл .so не может быть загружен.Переменная LD_LIBRARY_PATH указывает дополнительное место для поиска файлов * .so.

Я нахожусь на 32-битной Ubuntu с Sun Java.Я собирал так:

gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so
4 голосов
/ 02 сентября 2011

Ваш пример работал для меня при 32-битной установке Linux.

Скомпилирована ли ваша общая библиотека как 32-битная или 64-битная общая библиотека?Проверьте с помощью команды file libHelloWorld.so.Если ваша совместно используемая библиотека является 64-битной, то при запуске Java необходимо указать параметр командной строки -d64, чтобы Java могла загружать 64-битную разделяемую библиотеку.

Если ваша разделяемая библиотека является 32-битной, возможно,опция Java -d32 решит проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...