7

我将编写一个 Java 服务器/客户端应用程序,其中客户端并不是真正的客户端(它没有主程序),但它是一个库。

另外,我必须开发一个需要与服务器交互的C模块(一个熔断器驱动程序),所以它需要调用客户端的函数。

我已经创建了许多从 Java 应用程序调用的 C 函数示例,但没有一个是我需要的。

你能给我一个建议或一些提示吗?

编辑

因为有人不明白我需要什么,所以我想更清楚一点:我有一个服务器,一个程序只能使用一个用 Java 编写的库与之交互。真正的客户端是用C编写的,它必须能够调用库的函数,所以在CI中必须调用java方法

4

1 回答 1

7

基本上有两种方法可以链接 C 和 Java 代码;JNA 和 JNI。

JNA通常用于琐碎的接口;使用适当的签名绑定共享库,以便从 JVM 调用到 C 库。有些事情单独使用 JNA 是不可行的,尤其是对 Java 方法的调用和在 C 端直接修改 Java 对象,在这种情况下,很快就会在另一层中向上和向下传递修改。关键是,类型映射仅限于基元和一些数组(缓冲区/字符串)类型:http: //jna.java.net/javadoc/overview-summary.html#marshalling。该层很可能包含不太简洁的代码,从而引入了额外的开销。但是,仅使用 JNA 还是不可能从 C 函数调用 Java 方法。

如果您需要在 C 中“从下方”调用 Java 方法或在 JVM 的对象中旋转,请从 JNI 开始。

根据您的问题,我假设您可能希望从 C(本机)端而不是从 JVM 执行整个 Java <> C 工具。在这种情况下,您需要使用 JNI 将 JVM 嵌入到您的 C/C++ 应用程序中:https ://stackoverflow.com/a/7506378/1175253

如何为 JNI 实现生成 C 头文件:如何在 Eclipse 中生成 JNI 头文件

当然,您可以(或者更确切地说应该)用 C++ 实现 JNI C 函数,它通过使用 RAII 等简化了资源管理。


编辑

使用 JNI 编程 == 玩火。处理 C 端的全局引用、线程、数组固定等。您是否真的需要使用 JNI 在很大程度上取决于您想要实现的目标。

可以分别从 for 调用或修改中检索任何 Java 类及其方法和字段JNIEnv(就像 Java 的反射一样)。以这种方式调用本机 Java (JNI) 方法可能很危险。假设在 C 实现中锁定了一个非递归互斥锁,那么嵌套调用可能会陷入死锁。因此,人们通常会从 C 中调用普通的(简单)Java 方法,这些方法既不是本机的,也不是自己调用自己的本机方法,即使只是为了适当的设计。JNI 引入的开销与我在最近的项目中所经历的相比可以忽略不计。

于 2013-04-13T16:05:22.270 回答