我尝试用jna 在linux服务器上调用多个相互依赖的.so文件(如图)
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
结果:
如果你在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);
}
}