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

Java JNI 和 Delphi 相互調用(1)-JAVA調用DELPHI JNI 不是什麼新技術,英文全稱是:Java Native Interface,JAVA本地化代碼接口。本地化代碼是指直接編譯成的與機器相關的二進制代碼,而不是Java字節碼之類的中間代碼。對於 JNI 的來龍去脈,不作介紹了,在 java.sun.com 有介紹,另外 BAIDU/GOOGLE 搜索,也有大把的。這裏僅僅做一個入門級的介紹和實現。JAVA發佈的是C/C++的接口文檔,DELPHI 阅读详情

要正确地访问类对象的成员属性(字段)及成员方法,最重要的一点是一定要给出正确的签名,在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类型)和字段ID(JField类型),就可以根据提供的对象和字段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>”,方法签名表示它有两个参数,分别是String和double。然后就是参数的传入了,在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代码的方法,有兴趣的读者不妨自己研究一下。

Java与Delphi通过JNI实现本地调用实战指南 在Java Native Interface(JNI)体系中,Java本地方法的定义与动态库的加载构成了整个跨语言交互的基础。本章将从Java本地方法的声明与实现入手,逐步介绍如何编译并加载C/C++动态库,以及本地方法的注册与调用流程,最后探讨在实际开发过程中常见的错误与调试方法。在Java类中,使用native关键字声明一个本地方法。 阅读详情

相关推荐

用Delphi开发JNI应用

NULL 博文链接:https://lfzhs.iteye.com/blog/360191

用Delphi开发JNI应用(转)

JNI(Java Native Interface,Java本地接口)技术大家都不陌生,它可以帮助解决Java访问底层硬件的局限和执行效率的提高。关于JNI的开发,大多数资料讨论的都是如何用C/C++语言开发JNI,甚至于JDK也提供了一个javah工具来自动生成C语言程序框架。但是,对于广大的Delphi程序员来说,难道就不能用自己喜爱的Delphi与Java互通消息了吗? 通过对jav

代码人生 3653

delphi通过JNI调用JAVA函数

delphi通过JNI调用JAVA函数的一个小DEMO

DelphiJNI实际调试

1:下载 DelphiJNI:下载地址https://github.com/aleroot/DelphiJNI,版本比较老,没有找到其他,就用这个吧,如朋友有较新的pas文件,请留言下。2:下载jdk,这里下载JDK,这里使用javase-jkd18,也不知道这个版本要不要收费,这里学习用暂时不关新这个。5:运程过程中几经折腾,编译为32不能正常运行,64为依然提示找不到jvm.dll,path中添加路径,6位下正常调用。

ljklxlj的专栏 503

DELPHI开发JNI必备 jni.pas

DELPHI开发JNI必备 jni.pas 包含文件 jni.pas JNI_MD.INC

Delphi调用Java类和包源代码

Delphi调用Java类源代码,本人测试一切OK的,大家可以参考一下。

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

现在很多SDK都提供了JAVA接口。但是没有Delphi接口。 没有办法只好曲线救国。我们可以通过 JNI 的方式在 Delphi10.3 中调用 Java 的函数。 第一步:创建 Java 虚拟机和运行环境 procedure TForm1.FormCreate(Sender: TObject); var Options: array [0 .. 4] of JavaVMOption...

dbyoung的Delphi专栏 1820

DELPHI 11调用JAVA 接口

DELPHI 11 调用 JAVA 接口 ,传入 JAVA接口地址,和参数 返回结果

关于 Delphi 11.3跨平台开发Android调用 JNI JAR java 的说明和注意事项

如果是正在开发的 APP 在任何机器上闪退,特别是旧版本升级来的,别人复制给你的。一般是 发布信息混乱,造成的。当你需要一个 getApplicationContext 对象的时候,可以试试 TAndroidHelper.Context.getApplicationContext,这是因为你不懂自己看源码,不是我的错。如果提示你 java class xxx could not be found,如果是官方 xxx ,那么是你的手机内部没提供这个接口,你可以自己找官方的 jar 文件来加入、

1574

用Delphi开发JNI.docx

用Delphi开发JNI.docx

3D Gaussian Splatting环境配置和运行

使用conda命令根据environment.yml文件创建虚拟环境时,安装的pytorch是使用conda install 命令来安装的,实际上并不能成功安装带有gpu的pytorch,而这两个模块的安装依赖于带gpu的pytorch。如果不注释掉这三行,直接安装会报错

m0_46360757的博客 3326

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

JNI(Java Native Interface,Java本地接口)技术大家都不陌生,它可以帮助解决Java访问底层硬件的局限和执行效率的提高。关于JNI的开发,大多数资料讨论的都是如何用C/C++语言开发JNI,甚至于JDK也提供了一个javah工具来自动生成C语言程序框架。但是,对于广大的Delphi程序员来说,难道就不能用自己喜爱的Delphi与Java互通消息了吗?通过对javah生

SHARE & TOP 2374

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境)

本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。

weixin_29327977的博客 541

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

JNI(Java Native Interface,Java本地接口)技术大家都不陌生,它可以帮助解决Java访问底层硬件的局限和执行效率的提高。关于JNI的开发,大多数资料讨论的都是如何用C/C++语言开发JNI,甚至于JDK也提供了一个javah工具来自动生成C语言程序框架。但是,对于广大的Delphi程序员来说,难道就不能用自己喜爱的Delphi与Java互通消息了吗?通过对javah生

我的新blog:<http://nokiaguy.blogjava.net> <http://nokiaguy.cnblogs.com> 1350

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 253

delphi java jni 互通_用Delphi开发JNI(Java+Native+Interface)应用

JNI(Java+Native+Interface,Java本地接口)技术大家都不陌生,它可以帮助解决Java访问底层硬件的局限和执行效率的提高。关于JNI的开发,大多数资料讨论的都是如何用C/C++语言开发JNI,甚至于JDK也提供了一个javah工具来自动生成C语言程序框架。但是,对于广大的Delphi程序员来说,难道就不能用自己喜爱的Delphi与Java互通消息了吗?­通过对javah生成...

weixin_34637293的博客 396

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5604

delphi java jni 互通_转:Java JNI 和 Delphi 相互調用(1)-JAVA調用DELPHI

JNI 不是什麼新技術,英文全稱是:Java Native Interface,JAVA本地化代碼接口。本地化代碼是指直接編譯成的與機器相關的二進制代碼,而不是Java字節碼之類的中間代碼。對於 JNI 的來龍去脈,不作介紹了,在 java.sun.com 有介紹,另外 BAIDU/GOOGLE 搜索,也有大把的。這裏僅僅做一個入門級的介紹和實現。JAVA發佈的是C/C++的接口文檔,DELPHI...

weixin_39639643的博客 192

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 310

Python爬虫实战:利用Playwright与异步技术高效抓取链家十万级二手房数据

在开始编写代码之前,我们首先需要为项目选择合适的技术栈。1. 传统方案:Requests + BeautifulSoup优点: 简单、轻量、学习成本低。直接发送HTTP请求获取HTML,然后解析。缺点: 对于大量由JavaScript动态渲染的内容无能为力。现代网站(包括链家)大量使用JS来加载数据和实现交互,简单的HTTP请求无法获取到完整的页面内容。此外,容易被基于IP或请求头特征的反爬机制拦截。2. 进阶方案:Selenium优点。

2201_76125261的博客 891

delphi java jni 互通_转:Java JNI 和 Delphi 相互調用(1)-JAVA調用DELPHI(示例代码)

JNI 不是什麼新技術,英文全稱是:Java Native Interface,JAVA本地化代碼接口。本地化代碼是指直接編譯成的與機器相關的二進制代碼,而不是Java字節碼之類的中間代碼。對於 JNI 的來龍去脈,不作介紹了,在 java.sun.com 有介紹,另外 BAIDU/GOOGLE 搜索,也有大把的。這裏僅僅做一個入門級的介紹和實現。JAVA發佈的是C/C++的接口文檔,DELPHI...

weixin_34805367的博客 182

SAP ABAP OData 的四种开发方式

摘要:SAP开发中CDS视图转OData服务的四种方案演进:1)7.40+版本需手动映射数据源;2)7.50+可直接引用CDS视图自动生成服务;3)7.50+通过@OData.publish注解声明式发布;4)7.54+采用服务定义与绑定实现协议解耦。新版本推荐使用最新方案,旧系统可选传统方式,整体呈现开发简化、架构解耦的技术演进趋势。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 865
上一篇: Java语言编程中更新XML文档的常用方法
下一篇: 用Delphi开发JNI(Java Native Interface)应用(一)
sharetop
博客等级 码龄25年 561粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值