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

现在很多SDK都提供了JAVA接口。但是没有Delphi接口。

没有办法只好曲线救国。我们可以通过 JNI 的方式在 Delphi10.3 中调用 Java 的函数。

第一步:创建 Java 虚拟机和运行环境

procedure TForm1.FormCreate(Sender: TObject);
var
  Options: array [0 .. 4] of JavaVMOption;
  VM_args: JavaVMInitArgs;
  ErrCode: Integer;
begin
  { 创建 Java 虚拟机 }
  FJavaVM                    := TJavaVM.Create(JNI_VERSION_1_8);
  Options[0].optionString    := PAnsiChar(AnsiString('-Djava.class.path=' + ExtractFilePath(ParamStr(0)) + 'classes'));
  VM_args.version            := JNI_VERSION_1_8;
  VM_args.Options            := @Options;
  VM_args.nOptions           := 1;
  VM_args.ignoreUnrecognized := True;
  ErrCode                    := FJavaVM.LoadVM(VM_args);
  if ErrCode < 0 then
  begin
    MessageBox(Handle, 'Create Java VM Error', 'Delphi 10.3 调用 Java Class', MB_OK OR MB_ICONERROR);
    Halt;
    Exit;
  end;

  { 创建 Java 虚拟机运行环境 }
  FJavaEnv := TJNIEnv.Create(FJavaVM.Env);
  if FJavaEnv = nil then
  begin
    MessageBox(Handle, 'Create Java Env Error', 'Delphi 10.3 调用 Java Class', MB_OK OR MB_ICONERROR);
    Exit;
  end;
end;

第二步:执行 Java 函数 

procedure TForm1.btn1Click(Sender: TObject);
var
  jcls             : JClass;
  strClass         : UTF8String;
  strMetod         : UTF8String;
  strSign          : UTF8String;
  strArg, strResult: string;
begin
  { 查询 Java 类名 }
  strClass := 'com/test/javafordelphi/JavaClassForDelphiTest';
  jcls     := FJavaEnv.FindClass(strClass);
  if jcls = nil then
  begin
    ShowMessage('cant find java class');
    Exit;
  end;

  { Java 函数名称、参数类型、参数 }
  strMetod := 'goTest';          // 函数名称
  strSign  := 'String (String)'; // 参数类型,返回值类型
  strArg   := '123';             // 输入参数

  { 执行 Java 函数 }
  strResult := CallMethod(FJavaEnv, jcls, strMetod, strSign, [strArg], True);
  if strResult <> '' then
  begin
    MessageBox(Handle, PChar(Format('JavaClassForDelphiTest.goTest  Result: %s', [strResult])), 'Delphi 10.3 调用 Java Class', MB_OK OR MB_ICONINFORMATION);
  end;
end;

第三步:销毁虚拟机

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FJavaEnv.Free;
  FJavaVM.DestroyJavaVM;
  FJavaVM.Free;
end;

添加 JNI, JNIUtils 单元引用。

添加两个成员变量:

  private
    FJavaVM : TJavaVM;
    FJavaEnv: TJNIEnv;

 

编译通过。

 

不要着急运行。先确认一下你是否安装了JAVA,并且系统搜索路径中是否包含 Java 的路径。

默认是(x86):

C:\Program Files (x86)\Java\jdk1.8.0_202\bin

C:\Program Files (x86)\Java\jdk1.8.0_202\jre\bin\server

如果没有,将它们添加到 Windows 系统搜索路径中(环境变量:Path)。

执行。

效果图1

效果图2

 

完整代码,包含 jni 源代码代码,和2个DEMO源代码,可以从这里下载:

https://download.csdn.net/download/dbyoung/11096704

 

---------------------------------------------------------------------------------------------------------------------------------

开发语言:  
  Delphi10.3

开发作者:
  dbyoung@sina.com
  QQ群:101611228

开发时间:
  2019-04-06
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbyoung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值