在C中嵌入Java库

时间:2013-04-13 15:20:26

标签: java c java-native-interface

我打算编写一个Java服务器/客户端应用程序,其中客户端实际上不是客户端(它没有主服务器),但它是一个库。

除此之外,我必须开发一个需要与服务器交互的C模块(一个保险丝驱动程序),因此它需要调用客户端的功能。

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

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

修改

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

1 个答案:

答案 0 :(得分:5)

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

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

如果你需要调用Java方法或在C语言中从下面的'JVM'对象中转动,请从JNI开始。

从您的问题中,我假设您可能想要执行整个Java<>来自C(本机)端的C工具,而不是来自JVM。在这种情况下,您需要使用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引入的开销与我在最近的项目中所经历的开销相差无几。