zoukankan      html  css  js  c++  java
  • 转: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)Javajdk1.8.0_202in

    C:Program Files (x86)Javajdk1.8.0_202jreinserver

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

    执行。
    ————————————————
    版权声明:本文为CSDN博主「dbyoung」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/dbyoung/java/article/details/89085406

  • 相关阅读:
    注册接口
    配置node 的路由
    mongoose 与 mylab 的使用 (1)
    PHP中PDO错误/异常(PDOException)处理
    如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!
    PHP5中PDO的入门教程
    PHP文件夹文件拷贝/复制函数 dir_copy($src = '', $dst = '')
    php将图片以二进制保存到mysql数据库并显示
    php 显示sqlserver二进制图片
    XML文档的PHP程序查询代码
  • 原文地址:https://www.cnblogs.com/timba1322/p/12678555.html
Copyright © 2011-2022 走看看