【问题标题】:Embed Java library in C在 C 中嵌入 Java 库
【发布时间】:2013-04-06 01:00:42
【问题描述】:

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

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

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

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

编辑

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

【问题讨论】:

  • @RussellZahniser 完全没用的评论,因为他试图从 c 调用 java,而不是从 java 调用 c。
  • @RussellZahniser 他有一个需要一些 Java 库的 C 客户端,JNI 允许 Java 调用 C 函数,但他想做的恰恰相反,他想从 C 应用程序调用他的 Java 库,所以他不需要JNI
  • @Harlandeaka Invocation API 允许您从 C/C++ 调用 Java 代码,它是 JNI 规范的一部分。
  • 如果您无法按照 maba 的建议进行操作,您始终可以 1) 在 Java 库周围创建一个 main() 类,该类从标准输入获取请求并将响应写入标准输出 2) 启动 JVM作为来自 C 客户端的新进程,并通过 stdin/stdout 与包装的 Java 库进行交互。
  • 如果您已经在做客户端-服务器架构,为什么不实际做呢?与使用原始 JNI 调用来编组数据结构相比,将 ZeroMQ 或 DBus 与其他消息传递中间件和序列化库(JSON 或 Protocol Buffers 或 Thrift 或其他)连接在一起应该更容易维护。

标签: java c java-native-interface


【解决方案1】:

基本上有两种方法可以链接 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 头文件:How to generate JNI header file in Eclipse

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


编辑

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

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

【讨论】:

  • 好的,可能是这样。我不明白的是,我需要调用的 Java 方法是否必须使用 JNI 编写,或者作为简单的 Java 方法,如果这种观点更好(在性能、可维护性和设计问题方面)然后使用插座
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多