将* .SO库包含在Java项目中(Linux)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将* .SO库包含在Java项目中(Linux)相关的知识,希望对你有一定的参考价值。

我不是Java开发人员,但我需要解决一个问题:我需要将linux SO库包含到现有的Java项目中。该库是使用CGO开发的,可以与C ++,Python ctypes,Ruby FFI等一起使用。但我不能将它包含在没有错误的Java项目中(java.lang.UnsatisfiedLinkError)。我已经阅读了一些像this这样的文章,所描述的方法是我需要首先使用javah创建一个C头,然后编写一个C程序,依此类推。但是,如果我已编译* .SO文件该怎么办?有没有办法,如何简单地加载现有的SO文件(写在C上)并调用它的函数?

答案

Java没有内置的FFI功能。

在Java中使用本机库(.dll / .so)的一个选择是编写一个JNI包装器库,它具有可以绑定到Java本机方法的特殊功能。这是您需要使用javah为包装器库创建头文件的选项。有关如何执行此操作,请参阅Oracle网站上的“Java Native Interface”文档。

另一种方法是使用像JNA这样的“胶水”库。您不需要以这种方式构建另一个库,但是您需要在项目中包含JNA并为其执行必要的Java声明。您可以在Github存储库中找到JNA的文档以及代码。这种方法类似于Python,Ruby等。

我建议您阅读两者,看看哪种更适合您的需求。

以上是关于将* .SO库包含在Java项目中(Linux)的主要内容,如果未能解决你的问题,请参考以下文章

java 调用so文件

Android 逆向Android 中常用的 so 动态库 ( /system/lib/libc.so 动态库 | libc++.so 动态库 | libstdc++.so 动态库 )(代

Android 逆向Android 中常用的 so 动态库 ( /system/lib/libc.so 动态库 | libc++.so 动态库 | libstdc++.so 动态库 )(代

linux下,有几个.so。如何将这几个动态库编译成一个动态库

全网首发:Java在LINUX上系统上加载OpenCV so库的范例代码

Android 安装包优化使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )(代