关于linux系统下多个相互依赖的.so文件的java jna调用

我尝试用jna 在linux服务器上调用多个相互依赖的.so文件(如图)

img


然后我尝试用网上相似的办法去调用,有些找到了,但有一个怎么也找不到,请问该如何解决?
以下是我的Try.java的代码

import com.sun.jna.Native;
import com.sun.jna.Library;
import java.io.File;
public class Try{    
    public static interface PPOCR extends Library{
        int main(int argc,String[] argv);
        void checkParams();
        String getResult(int argc,String[] argv);
    }
    public static interface Paddle extends Library{

    }
    public static void main(String[] args){     
    // System.load(new File("libonnxruntime.so.1.11.1").getAbsolutePath());
        Paddle Inference2=(Paddle)Native.load(new File("libonnxruntime.so.1.11.1").getAbsolutePath(),Paddle.class);
        Paddle Inference1=(Paddle)Native.load("libiomp5.so",Paddle.class);
        Paddle Inference3=(Paddle)Native.load("libpaddle2onnx.so.0.9.9",PPOCR.class);
        Paddle Inference=(Paddle)Native.loadLibrary("paddle_inference",Paddle.class);
        PPOCR Instance=(PPOCR)Native.loadLibrary("ppocr",PPOCR.class);
        System.out.println("start");
        String arg="ppocr.exe system --det_model_dir=inference/ch_PP-OCRv3_det_infer --rec_model_dir=inference/ch_PP-OCRv3_rec_infer --image_dir=181.png";
        String[] arg_all=arg.split(" ");
        int str=Instance.main(arg_all.length,arg_all);
    }
}

运行指令:

rm *.class
javac -cp ".:/home/ubuntu/ocr-test/*"  Try.java 
java -cp ".:/home/ubuntu/ocr-test/*"  Try

结果:

img

如果你在Linux系统下使用JNA来调用多个相互依赖的.so文件,你可以考虑以下几个方法解决问题:

1.检查依赖项是否安装:某些.so文件可能需要其他的依赖项才能正常工作。请确保你的系统上已经安装了所有的必要的依赖项。

2.确定动态链接库的位置:你需要确定动态链接库的位置,并将其路径添加到环境变量LD_LIBRARY_PATH中。

设置库搜索路径:您可以通过以下方式在Java代码中设置库搜索路径

System.setProperty("jna.library.path", "/path/to/library");

4.手动加载所有相关的动态链接库:如果您不能确定动态链接库的顺序,您可以手动加载所有相关的动态链接库。

System.load("/path/to/library1");
System.load("/path/to/library2");

如果仍然无法解决问题,请尝试提供更多的信息,例如错误消息,代码示例等,以便更好地帮助您解决问题。

没看懂

使用 Java 的 System.load() 方法加载所有需要的 .so 文件,例如:
lua
Copy code
System.load("/path/to/libA.so");
System.load("/path/to/libB.so");
使用 Java 的 System.setProperty() 方法设置 java.library.path 属性,指向所有需要的 .so 文件的目录,例如:
python
Copy code
System.setProperty("java.library.path", "/path/to/libA:/path/to/libB");
将所有需要的 .so 文件打包为一个单独的 .jar 文件,并将该 .jar 文件作为 classpath 进行加载。
注意:上述方法都需要确保你拥有相关文件的读取权限。

方法一



可以使用JNA来调用多个相互依赖的.so文件,首先需要在Linux服务器上安装JNA库:

sudo apt-get install libjna-java

然后可以使用以下代码来加载所有相互依赖的.so文件:

String[] libnames = new String[2]; libnames[0] = "lib1.so"; libnames[1] = "lib2.so"; Native.loadLibrary(libnames);

方法二

java通过JNA可以直接调用linux系统下多个相互依赖的.so文件,首先要在java的classpath中添加所有要使用的.so文件,然后通过Native.loadLibrary方法加载.so文件,最后就可以调用里面的方法了。

方法三



public class JnaTest {

    static {
        System.setProperty("jna.library.path", "./lib/");
    }

    public interface myLib extends Library {

        //加载so类库
        myLib INSTANCE = Native.loadLibrary("./lib/example.so", myLib.class);

        //调用so函数
        int func1(int a, int b);

        int func2(int a, int b);

        int func3(int a, int b);
    }

    public static void main(String[] args) {

        //加载so类库
        myLib lib = myLib.INSTANCE;

        int a = 1;
        int b = 2;

        //调用so函数
        int result1 = lib.func1(a, b);
        int result2 = lib.func2(a, b);
        int result3 = lib.func3(a, b);

        System.out.println("result1: " + result1);
        System.out.println("result2: " + result2);
        System.out.println("result3: " + result3);
    }

}