65.9K
CodeProject 正在变化。 阅读更多。
Home

在 C# 中使用 Java 本机接口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (17投票s)

2011 年 8 月 26 日

CPOL

4分钟阅读

viewsIcon

162116

downloadIcon

4930

如何从 .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/

© . All rights reserved.