8

我已经做了几年Java 开发人员,听说你可以用JNI 做一些非常有用和强大的事情。我不知道我是否只是不需要使用它,或者它是否与我不太相关;但我根本不用碰它。

我想知道 Java 这方面的用处是什么。例子会很棒。

4

5 回答 5

13

这是非常有用的。我可以看到使用 JNI 的两个主要原因(可能还有更多)。

  1. 表现。如果您有一段代码,其中 Java 运行时出于某种原因无法降低其性能。您可以在本机代码中实现该函数并从 Java 中调用它。如果您确实需要,这允许您手动调整实现。这可能是最不常见的原因,Java 通常表现得很好。

  2. 访问操作系统特定的 API。这是一个大人物。我有一个案例,我需要用 Java 做一些事情,但也需要访问 Java 根本无法提供的东西。就我而言,它是 UNIX 域套接字。由于(正如您可以从名称中看出的那样)它们是 UNIX 特定的,因此没有标准的 Java 方法来使用它们。因此,我在 C 中创建了一个类,该类在它们周围充当包装器,并使用 JNI 访问它。中提琴,问题解决了。

于 2008-12-31T06:51:45.350 回答
4

我为 iSeries 编写了一个扩展的 JNI 层来访问 DB2、用户队列、数据队列和一些其他 OS/400 细节。如果没有 JNI,我们在 iSeries 上的大部分系统都是不可能的。所以,是的,JNI 有它的位置,当你需要它时,你真的需要它。

它相对困难(仅次于纯 Java),但功能强大且不可怕。

此外,每当我查看一些 JNI 代码时,我也会考虑使用JNA

于 2008-12-31T08:45:26.307 回答
2

我能想到一些用途:

  1. 与没有 Java 对应物的现有低级 (C/C++) API 集成
  2. 与未通过可用 Java API 公开的系统方面集成(直接硬件访问等)

有人可能会说它对于创建高度优化的代码部分很有用,但是使用现代 JVM,您会变得非常快,使用 JNI 的复杂性可能会超过您可能看到的任何性能优势。

于 2008-12-31T06:52:25.410 回答
1

绑定到 FFMPeg 用于(该死的几乎任何)视频/音频格式的 C 解码有一些用途。

还有 JNA,这让您感觉像是在使用库本身。从将所有内容传递给 Java 开发人员来管理的角度来看,这“更容易”,而从某种意义上说,这更“容易”,因为您必须弄清楚结构映射并做很多繁重的工作才能让所有指针等通过正确。

于 2008-12-31T08:46:20.407 回答
1

我们需要围绕在 Suse Linux 上运行的传统 C 应用程序包装新 UI。JNI 是完成这项工作的完美工具。

总的来说,我认为 JNI 与 Java 的“一次编写,随处运行”的概念相矛盾。但是,在某些用例中 JNI 可能很有用。

于 2008-12-31T08:52:19.427 回答