我在从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课上,我有这个:
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
如果您想了解更多信息,请不要犹豫。再次谢谢你。
答案 0 :(得分:1)
本机链接器找不到共享对象。将带有so的文件夹添加到LD_LIBRARY_PATH
中。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:Libraries/
或者,您可以将其添加到本地库文件夹(通常为/usr/local/lib
)并重新运行ldconfig
。
答案 1 :(得分:0)
所以我终于找到了原因,这不是使用多个文件中的多个功能的方法。您只需要将所需的所有文件放入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