gpt4 book ai didi

java - 在 C 中嵌入 Java 库

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:18:08 26 4
gpt4 key购买 nike

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

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

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

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

编辑

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

最佳答案

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

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

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

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

如何为 JNI 实现生成 C header :How to generate JNI header file in Eclipse

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


编辑

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

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

关于java - 在 C 中嵌入 Java 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com