`
yesjavame
  • 浏览: 698792 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

用Delphi开发JNI(Java Native Interface)应用(二)

阅读更多

要正确地访问类对象的成员属性(字段)及成员方法,最重要的一点是一定要给出正确的签名,在Java中对于数据类型和方法的签名有如下的约定:

数据类型/方法

签名

byte

B

char

C

double

D

float

F

int

I

long

J (注意:是J不是L)

short

S

void

V

boolean

Z(注意:是Z不是B

类类型

L跟完整类名,如Ljava/lang/String; (注意:以L开头,要包括包名,以斜杠分隔,最后有一个分号作为类型表达式的结束)

数组type[]

[type,例如 float[]的签名就是[float,如果是二维数组,如float[][],则签名为[[float,(注意:这里是两个 [ 符号)。

方法

(参数类型签名)返回值类型签名,例如方法: float fun(int a,int b),它的签名为(II)F(注意:两个I之间没有逗号!),而对于方法String toString(),则是()Ljava/lang/String;

通过上面的例子,我们了解了访问对象参数的成员属性或方法的基本步骤和多个Get方法的使用。TJNIEnv同时提供了多个Set方法,可以修改传入的对象参数的字段值,因为Java对象参数都是以传址的方式进行传递的,所以修改的结果可以在Java程序中得到反映。TJNIEnv提供的Get/Set方法,都需要两个基本参数:对象实例(JObject类型)和字段IDJField类型),就可以根据提供的对象和字段ID来获取或设置这个对象的这个字段的值。

现在我们了解了在Delphi代码中使用以及修改Java对象的操作步骤。进一步,如果需要在Delphi中从无到有地创建一个新的Java对象,可以吗?再来看一个例子,在Delphi中创建Java类的实例,操作方法其实也非常简单。

先在Java代码中增加一个本地方法,如下:

public native Book findBook(String t);

然后,修改Delphi代码,增加一个函数(因为有返回值,所以不再是过程而是函数了):

function Java_HelloWorld_findBook(PEnv: PJNIEnv; Obj: JObject; t:JString):JObject; stdcall;

var

JVM: TJNIEnv;

c: JClass;

fid:JFieldID;

b:JObject;

mid:JMethodID;

begin

JVM := TJNIEnv.Create(PEnv);

c:=JVM.FindClass('Book');

mid:=JVM.GetMethodID(c,'<init>','()V');

b:=JVM.NewObjectV(c,mid,nil);

fid:=JVM.GetFieldID(c,'title','Ljava/lang/String;');

JVM.SetObjectField(b,fid,t);

fid:=JVM.GetFieldID(c,'price','D');

JVM.SetDoubleField(b,fid,99.8);

Result:=b;

JVM.Free;

end;

这里先用FindClass方法根据类名查找到类,然后获取构造函数的方法ID,构造函数名称固定为“<init>”,注意签名为“()V”说明使用了Book类的一个空的构造函数。然后就是使用方法NewObjectV根据类和构造函数的方法ID来创建类的实例。创建了类实例,再对它进行操作就与前面的例子没有什么两样了。对于非空的构造函数,则略为复杂一点。需要设置它的参数表。还是上面的例子,在Book类中增加一个非空构造函数:

public Book(Strint t,double p){

this.title=t;

this.price=p;

}

Delphi代码中,findBook函数修改获取方法ID的代码如下:

mid:=JVM.GetMethodID(c,'<init>','(Ljava/lang/String;D)V');

构造函数名称仍是“<init>”,方法签名表示它有两个参数,分别是Stringdouble。然后就是参数的传入了,在Delphi调用Java对象的方法如果需要传入参数,都需要构造出一个参数数组。在变量声明中加上:

args : array[0..1] of JValue;

注意!参数都是JValue类型,不管它是基本数据类型还是对象,都作为JValue的数组来处理。在代码实现中为参数设置值,并将数组的地址作为参数传给NewObjectA方法:

args[0].l:=t; // t是传入的JString参数

args[1].d:=9.8;

b:=JVM.NewObjectA(c,mid,@args);

JValue类型的数据设置值的语句有点特殊,是吧?我们打开jni.pas,查看一下JValue的定义,原来它是一个packed record,已经包括了多种数据类型,JValue的定义如下:

JValue = packed record

case Integer of

0: (z: JBoolean);

1: (b: JByte );

2: (c: JChar );

3: (s: JShort );

4: (i: JInt );

5: (j: JLong );

6: (f: JFloat );

7: (d: JDouble );

8: (l: JObject );

end;

下面再来看一下错误处理,在调试前面的例子中,大家也许看到了一旦在Delphi的执行过程中发生了错误,控制台就会输出一大堆错误信息,如果想要屏蔽这些信息,也就是说希望在Delphi中捕获错误并直接处理它,应该怎么做?也很简单,在TJNIEnv中提供了两个方法可以方便地处理在访问Java对象时发生的错误。

var

… …

ae:JThrowable;

begin

… …

ae:=JVM.ExceptionOccurred;

if ( ae<>nil ) then

begin

Writeln(Format('Exception handled in Main.cpp: %d', [longword(ae)]));

JVM.ExceptionDescribe;

JVM.ExceptionClear;

end;

… …

用方法ExceptionOccurred可以捕获Java抛出的错误,并存入JThrowable类型的变量中。用ExceptionDescribe可以显示出Java的错误信息,而ExceptionClear显然就是清除错误,让它不再被抛出。

至此,我们已经把从Java代码通过JNI技术访问Delphi本地代码的步骤做了初步的探讨。在jni.pas中也提供了从Delphi中打开Java虚拟机执行Java代码的方法,有兴趣的读者不妨自己研究一下。

分享到:
评论

相关推荐

    用Delphi开发JNI.docx

    Delphi开发JNI(Java Native Interface)应用是指使用Delphi语言来开发基于JNI的本地代码,以便与Java进行交互通信。在本文中,我们将讨论如何使用Delphi语言来开发JNI本地代码,并与Java进行交互。 JNI(Java ...

    用Delphi开发JNI应用

    总的来说,用Delphi开发JNI应用是一个涉及多语言交互的过程,它需要对Java和Delphi的编程模型有深入的理解,以及对JNI接口的熟练掌握。`JNI.pas`文件则提供了在Delphi中实现这一过程的关键代码,是连接Java和Delphi...

    DELPHI开发JNI必备 jni.pas

    标题中的"DELPHI开发JNI必备 jni.pas"表明这是一个针对Delphi开发者的资源,其中包含的`jni.pas`文件是用Delphi编写的,目的是支持在Delphi项目中使用JNI来调用本地C/C++库或Java方法。`jni.pas`通常会封装JNI的C...

    delphi通过JNI调用JAVA函数

    当我们需要在Delphi项目中利用Java的功能时,JNI(Java Native Interface)成为了一座桥梁,使得两者能够相互调用。本篇将深入探讨如何在Delphi中通过JNI来调用Java函数。 首先,我们需要理解JNI的概念。JNI是Java...

    用Delphi开发JNI应用.rar

    标题 "用Delphi开发JNI应用.rar" 暗示了这个压缩包包含了关于使用Delphi编程语言开发Java Native Interface (JNI) 应用的资源。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。这篇教程可能是针对...

    Delphi10.3 中通过JNI调用 Java 函数

    本文将深入探讨如何在Delphi 10.3中利用JNI(Java Native Interface)技术来调用Java的函数,实现两者之间的交互。 JNI是Java平台的一部分,它为Java代码与其他语言编写的代码提供了一个标准接口。通过JNI,开发者...

    Delphi调用Java类和包源代码

    为了在Delphi中调用Java,我们需要一个中间桥梁,这就是JNI(Java Native Interface)。JNI允许Java代码调用本地(如C/C++或Delphi)代码,反之亦然。 1. **安装Java JDK**:首先,确保你已经在你的系统上安装了...

    delphi调用java类的jni完整版

    JNI(Java Native Interface)是Java平台的标准本地接口,允许Java代码和其他语言写的代码进行交互。在本案例中,"delphi调用java类的jni完整版"是一个关于如何使用Delphi编程语言通过JNI来调用Java类的示例。这个...

    delphi调用Java函数

    通常,这涉及到Java的Java Native Interface (JNI),这是一个允许Java代码和其他语言写的代码进行交互的框架。Delphi可以通过JNI来调用Java的方法,反之亦然。 1. **创建Java库**:在Java端,你需要编写一个包含你...

    DELPHI 7 调用 JAVA 接口

    4. **生成JNI头文件**:使用Java的`javah`工具生成C/C++的头文件,这个头文件包含了JNI函数原型,供Delphi使用。 5. **编写Delphi代码**:在Delphi 7中创建一个新的单元,导入生成的JNI头文件,并实现调用Java接口...

    jni java delphi调用

    Java和Delphi之间的交互主要通过Java Native Interface (JNI) 实现,这是一种允许Java代码调用本地(非Java)代码的框架。JNI在跨平台应用程序开发中扮演着重要角色,特别是当需要利用特定平台的库或者优化性能时。...

    DELPHI 11调用JAVA 接口

    1. **JNI(Java Native Interface)基础** JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Delphi中调用Java接口,主要依赖于JNI提供的机制。首先,我们需要了解JNI的头文件和库文件,...

    java与delphi结合

    - **JNI(Java Native Interface)**:Java通过JNI调用Delphi编写的本地库,实现对C/C++接口的调用。Delphi程序可以作为Java的本地库,提供性能优化或特定平台的功能支持。 - **COM/ActiveX**:Delphi可以创建COM...

    Delphi10.3 中通过JNI调用 Java 函数 DOME+控件

    在 Delphi 10.3 开发环境中,与 Java 的交互是通过 JNI(Java Native Interface)来实现的。JNI 是一种让本地代码(如 C++ 或 Delphi)能够调用 Java 代码,反之亦然的标准接口。这个过程涉及到对 Java 字节码的理解...

    Java调用Delphi开发的Dll小结[归类].pdf

    这两种方法分别是:通过JNI(Java Native Interface)和使用JNA(Java Native Access)第三方组件。 1. **JNI调用Delphi开发的DLL**: - JNI是Java平台标准的一部分,允许Java代码与其他编程语言(如C和C++)进行...

    JAVA的JAR或Class生成Delphi的Native Bridge File工具

    这个工具可能是一个自定义脚本或程序,能够解析JAR或Class文件,并生成对应的Delphi单元(Unit),这个单元包含了必要的JNI(Java Native Interface)调用代码,使得Delphi程序可以与Java代码交互。 使用这个工具的...

    RFID读卡程序-桌面应用程序-Java-JNI调用Delphi版DLL

    在本项目中,我们关注的是一个基于桌面的应用程序,它利用Java语言来实现RFID读卡功能,并通过JNI(Java Native Interface)调用了Delphi编写的DLL(动态链接库)。 Java JNI是Java平台提供的一种原生接口,允许...

    jni.pas

    《JNI.pas——Delphi与...无论是开发跨平台应用程序,还是利用Java库提升Delphi项目的功能,JNI.pas都是不可或缺的工具。理解和掌握JNI.pas的使用,对于Delphi开发者来说,意味着拥有了更广阔的编程视野和技术能力。

    TTS+JNI (delphi)案例

    这个案例提供完整的源代码和编译文件,有助于开发者理解和学习如何在Delphi和Java之间搭建桥梁,利用JNI(Java Native Interface)进行跨平台的通信。 JNI是Java平台的一部分,允许Java代码与其他编程语言如C、C++...

Global site tag (gtag.js) - Google Analytics