首页 > 解决方案 > 将 *.SO 库包含到 Java 项目 (Linux)

问题描述

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

标签: javajava-native-interfaceshared-libraries

解决方案


Java 没有内置的 FFI 功能。

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

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

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


推荐阅读