转: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)。

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

原文地址:https://www.cnblogs.com/timba1322/p/12678555.html

时间: 2024-10-31 09:15:45

转:Delphi10.3 中通过JNI调用 Java 函数的相关文章

init.rc文件中面启动c++程序,通过jni调用java实现

</pre><p>注:假设是自己的myself.jar包,还要修改例如以下:</p><p>target/product/core_base.mk PRODUCT_BOOT_JARS := core:myself</p><p></p><p>功能:手机开机后要写个标志位. 已有实现.就是收到开机广播后,启动服务读取bp中的标志位(java代码须要等待ril准备好).并把这个标志位写入到ap中(java代码调用c++

java native interface JNI 调用Java方法

在上一篇文章中介绍了JNI,以及java调用JNI,这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数. 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对

init.rc文件里面启动c++程序,通过jni调用java实现

功能:手机开机后要写个标志位. 已有实现,就是收到开机广播后,启动服务读取bp中的标志位(java代码需要等待ril准备好), 并把这个标志位写入到ap中(java代码调用c++). 后来遇到的问题:实际应用中发现,接收开机广播等待的时间更长,需要提前写入ap时间. 解决方案: 在init.rc文件里面启动c++程序,通过jni调用java实现. 精简代码如下: C++程序代码: #define LOG_TAG "testmain" #define LOG_NDEBUG 0 #incl

coco2dx jni 调用 java 相机返回 图片数据

新建 一个项目 名字:testJin  包名:com.TanSon.org  python命令:python create_project.py -project testJin -package com.TanSon.org -language cpp eclipse 导入项目配置 ... 略去,(可以google) 1 c++ 调用 andriod 1.1 包含头文件 #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.

JS中,子类调用超类函数

概述 JS虽然并不直接具备面向对象的特性,但仍可以通过prototype来模拟面向对象的继承和多态等特性.和大多数面向对象语言(例如C++,Java等)相比,JS来实现面向对象仍稍显繁琐和抽象,需要对JS的prototype模型有深入的理解. 在开发过程中,有时候会遇到这样一个问题:如果在子类中"覆盖"了超类的某个方法,但仍需要在子类方法中调用一次超类方法,这时候应该怎么做?如果是Java,一个简单的super关键字即可解决问题,但如果是JS呢? 解决问题的最基本方法可以是:在子类中,

JSP:使用EL表达式调用java函数

JSP:使用EL表达式调用java函数 使用一个例子 编写一个使用JSP表达式语言的JSP程序,输入一个数字,提交后输出该数字的九九乘法表. java代码实现打印9*9乘法表 Solution.java package method; public class Solution { public static String Mul99(int n){ String result=""; for(int i=1;i<=9;i++){ int temp=i*n; result=res

如何在sqlite3连接中创建并调用自定义函数

#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sqlite3连接中创建并调用自定义函数''' import sqlite3,hashlib #自定义函数 def md5sum(t): return hashlib.md5(t).hexdigest() #在内存中创建临时数据库 conn = sqlite3.connect(":memory:"

1.JAVA中使用JNI调用C++代码学习笔记

Java 之JNI编程1.什么是JNI? JNI:(Java Natibe Inetrface)缩写. 2.为什么要学习JNI?  Java 是跨平台的语言,但是在有些时候仍然是有需要调用本地代码 (这些代码通常是由C/C++编写的). Sun公司提供的JNI是Java平台的一个功能强大的接口.这个JNI接口提供了Java与操作系统本地代码互相调用的功能.(即java调用C++代码) 最简单的Java调用C/C++代码步骤 1.创建TestNativeCode工程,新建cn.itcast包,新建

Android NDK开发之Jni调用Java对象

https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数.下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对