在 C# 中使用 Java 本机接口






4.90/5 (17投票s)
如何从 .NET 应用程序调用 Java 方法。
引言
JNI 或 Java Native Interface 是 Java 平台提供的一组功能。使用 JNI 的应用程序可以将 Java 代码与使用 C++、Delphi 和 C# 等其他语言编写的代码相结合。
在我的示例中,我将展示如何从 C# 客户端调用几个 Java 方法。
优点
您可以重用您先前用 Java 编写的现有库/类,让您的新 C# 应用程序使用。这意味着您不必放弃用 Java 编写的遗留代码,再次在 C# 中重新发明轮子。
背景
在 JNI 中最重要的事情之一是熟悉字段描述符。您会在测试工具中注意到,当我调用一个接受字符串参数的 Java 方法时,我会传递 "Ljava/lang/String;"。这代表了 Java 编程语言中的一个字段类型。例如,如果您想表示一个 int 字段,则使用 "I";一个 float 字段使用 "F";一个 boolean 字段使用 "Z",依此类推。
下表描述了 Java 编程语言中的基本类型以及 JNI 中相应的类型。所有以 L 开头的字段描述符都作为对象处理(注意:字符串以对象形式传递),并且必须以 ";" 字符结尾。数组类型始终以 "[" 字符作为前缀。
JNI 字段描述符 | Java 语言类型 |
Z |
布尔值 |
B |
byte |
C |
char |
S |
short |
我 |
int |
J |
long |
F |
float |
D |
double |
Ljava/lang/String; |
字符串 |
[Ljava/lang/Object; |
object[] |
方法描述符利用字段描述符并描述 Java 方法的结构。方法描述符中字段描述符之间没有空格。
除了用 V 表示的 void
返回类型外,所有其他返回类型都使用字段描述符。下表描述了 Java 方法声明以及相应的 JNI 描述符。JNI 方法描述符用于通过 JNI 从 C# 调用 Java 方法。
Java 方法声明 | JNI 方法描述符 |
String foo(); |
"()Ljava/lang/String;" |
Void bar(int I, bool b); |
(IZ)V |
使用代码
从 .NET GUI 应用程序调用 Java 代码的示例
一旦引用了源代码下载部分中的 JNI 程序集,您就可以在几行代码中开始调用 Java 方法。
首先需要创建一个字典对象,其中包含要传递给 Java 虚拟机的所有参数。在下面的示例中,我只做了最少的事情,即设置类路径,这将告诉 JVM 在哪里查找类和包。
private Dictionary<string, string> jvmParameters = new Dictionary<string, string>();
jvmParameters.Add("-Djava.class.path", Location of the java class);
一旦 JVM 参数已分配给字典对象,就可以创建 JavaNativeInterface
的实例。创建后,需要使用 JVM 参数调用 LoadJVM
方法,这将加载 Java 虚拟机。加载后,用户调用方法来实例化 Java 对象(请注意,使用 InstantiateJavaObject
方法是可选的,因为用户可能只想调用一个静态方法,在这种情况下,不需要调用此方法;但是,它也不会造成任何损害)。
Java = new JavaNativeInterface();
Java.LoadVM(jvmParameters, false);
Java.InstantiateJavaObject(Name of the java class excluding the extension);
一旦 JVM 加载并实例化了一个类,用户就可以调用任何他们想要的方法。首先创建一个对象列表,其中包含要传递到 Java 方法的所有参数。由于这是一个对象列表,它可以容纳不同类型的参数,因为所有内容都继承自对象。
List<object> olParameters = new List<object>();
olParameters.Add(Value of the parameter to be passed to the java method);
接下来,只需调用泛型方法 CallMethod
,并将要调用的 Java 方法的返回类型作为模板类型传入。在下面的示例中,我调用 CallMethod<string>
,这意味着我要调用的 Java 方法的返回类型是字符串。
接下来,传入要调用的 Java 方法的名称以及方法描述符(见上文);最后,传入所有参数的列表。(注意:如果不需要参数,则传入一个空列表。)
Java.CallMethod<string>("AddTwoNumbers", "(IILjava/lang/String;)I", olParameters);
好了,我想这就说到这里了,但请记住,JNI 还有很多可以做的事情。测试应用程序只是一个快速简单的演示 JNI 组件基础知识的方法。要全面理解 JNI,我建议您阅读这本书:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/。