JNI вызывает функцию C, вызывая другую функцию в другом файле - PullRequest
0 голосов
/ 16 марта 2019

У меня проблема с вызовом функции C с использованием другой функции C из другого файла .c из моего Java JNI (не обращайте внимания на некоторые французские слова в моем коде, спасибо). Код на С работает нормально.

Вот две строки, которые я использую для компиляции моих библиотек. Я собираю свою первую библиотеку с помощью функции, которую я использую во второй библиотеке. Скажите мне, если я делаю это неправильно, чтобы иметь возможность сделать это:

gcc -fPIC -shared -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" -o Libraries/libfilemot.so ../IndexationTexte/fileMot.c gcc -fPIC -shared -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" ../IndexationTexte/indexationV1.c -L./Libraries/ -l:libfilemot.so -o Libraries/libindexation.so

В моем классе Java у меня есть это:

public class MoteurDeRecherche {

static {
    try {
        System.load("/home/aurelien/Documents/Projects/Projet_fil_rouge/noyau_c/JNI/Libraries/libfilemot.so");
        System.load("/home/aurelien/Documents/Projects/Projet_fil_rouge/noyau_c/JNI/Libraries/libindexation.so");
    }
    catch(UnsatisfiedLinkError e) {
        System.out.println("Erreur de chargement des librairies :\n" + e);
        System.exit(1);
    }
}

public static native void indexationTexte();

public static void main(String args[]) {
    MoteurDeRecherche.indexationTexte();
}

}

Но я получаю эту ошибку из моей библиотеки, которая успешно компилируется:

Erreur de chargement des librairies :
java.lang.UnsatisfiedLinkError: /home/aurelien/Documents/Projects/Projet_fil_rouge/noyau_c/JNI/Libraries/libindexation.so: libfilemot.so: cannot open shared object file: No such file or directory

Не стесняйтесь, если вам нужна дополнительная информация. Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Родной компоновщик не может найти ваш общий объект. Добавьте папку с таким к вашему LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:Libraries/

В качестве альтернативы, вы можете добавить это в вашу папку локальных библиотек (обычно /usr/local/lib) и перезапустить ldconfig.

0 голосов
/ 17 марта 2019

Итак, я наконец-то выяснил, почему это не способ использовать несколько функций из нескольких файлов.Вам просто нужно поместить все нужные файлы в команду gcc.Я не знаю, почему я пытался сделать библиотеку для одного файла зависимой от другой библиотеки для другого файла.Вот команда для моего проекта:

gcc -fPIC -shared -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" ../IndexationTexte/indexationV1.c ../IndexationTexte/fileMot.c -o Libraries/libindexation.so

Для более общего подхода, если у вас есть:

file1.c:

#include "file2.c"
void function1()
{
    function2();
}

file2.c:

void function2()
{
    printf("hey from an other file");
}

Вы должны просто скомпилировать свой проект так:

gcc -fPIC -shared -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" file1.C file2.c -o libmylibrary.so

...