为了账号安全,请及时绑定邮箱和手机立即绑定

JNI 调用 C 函数,调用其他文件中的其他函数

JNI 调用 C 函数,调用其他文件中的其他函数

慕无忌1623718 2022-08-17 10:54:05
我在使用来自Java JNI的其他.c文件中的其他C函数调用C函数时遇到问题(不要介意我的代码中的一些法语单词,谢谢)。C 中的代码工作正常。以下是我用来编译库的两行。我正在使用我在第二个库中使用的函数编译我的第一个库。告诉我,如果我做错了,能够做到这一点:gcc -fPIC -shared -I"$$JAVA_HOME/include" -I"$$JAVA_HOME/include/linux" -o Libraries/libfilemot.so ../IndexationTexte/fileMot.cgcc -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 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:Libraries/

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


查看完整回答
反对 回复 2022-08-17
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

所以我终于找到了为什么,这不是从多个文件使用多个函数的方法。您只需将所需的所有文件放在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


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号