JNI 调用 C 函数调用另一个文件中的另一个函数

JNI calling a C function calling an other function in an other file

我在使用 Java JNI 的另一个 .c 文件中的另一个 C 函数调用 C 函数时遇到问题(不要介意我的代码中有一些法语单词,谢谢)。 C 中的代码工作正常。

这是我用来编译库的两行代码。我正在用我在第二个库中使用的函数编译我的第一个库。告诉我我是否做错了才能做到这一点:

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 class 中,我有这个 :

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

如果您想了解更多信息,请不要犹豫。再次感谢。

本机链接器找不到您的共享对象。将带有 so 的文件夹添加到 LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:Libraries/

或者,您可以将其添加到本地库文件夹(通常 /usr/local/lib)并重新运行 ldconfig

所以我终于找到原因了,这不是从多个文件中使用多个函数的方式。您只需将所需的所有文件放入 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