delphi 调用java库_学习使用Delphi for android 调用Java类库

本文介绍了如何在Delphi Xe5中调用Android SDK的API,特别是如何封装和使用Java类库。通过创建类方法接口和实例方法接口,并结合工厂方法,实现对Java类的调用。以Android语音朗读引擎接口包Androidapi.JNI.TTS.pas为例,展示了接口和类的包装过程,以及在Delphi中的具体调用方式。
摘要由CSDN通过智能技术生成

Android是一套非常优秀的移动端操作系统,Delphi Xe5中也能直接调用SDK中提供的各项API,但是delphi自己封装的AndroidAPI非常少,在安装目录的 source\rtl\android 中,而且所提供的android API也没有明确sdk版本区别,很多事情都得我们自己来封装了完成。

在Delphi中将java类的通过接口进行包装,分为类方法接口及类实例方法接口两个部分,然后通过一种工厂方法将这两种接口混合起来,对外提供统一的java实例服务;

类方法:顾名思义就是属于类本身,不依赖类实例化就可调用的方法,类方法包装,主要是指包装java中静态属性,静态方法,构造方法(构造函数包装需要将构造函数命名为init,缺省是一个,也可以多个或者没有);

类实例:就是依赖实例化类后才能调用的方法;

有了上面的概念,下面针对java的接口包装及类包装分别进行说明,所引用的代码为Jeff编写的android API 19 的语音朗读引擎接口包android.speech.tts.TextToSpeech的Delphi实现Androidapi.JNI.TTS.pas;

l 接口(java)

1. 类方法包装(继承IJavaClass)

JTextToSpeech_OnInitListenerClass = interface(IJavaClass)

['{58D32EFB-6528-4EC6-BA4F-28B22FE8E573}']

end;

注意命名规范,这样利于你,也利于大家J打头Class结尾,大小写保持后Java一致

2. 实例方法包装(继承IJavaInstance)

[JavaSignature('android/speech/tts/SynthesisCallback')]

JSynthesisCallback = interface(IJavaInstance)

['{190C13DE-BC7E-44CE-94F6-4AF1A84A4612}']

function audioAvailable(buffer: TJavaArray; offset: Integer; length: Integer): Integer; cdecl;

function done: Integer; cdecl;

procedure error; cdecl;

function getMaxBufferSize: Integer; cdecl;

function start(sampleRateInHz: Integer; audioFormat: Integer; channelCount: Integer): Integer; cdecl;

end;

TJSynthesisCallback = class(TJavaGenericImport) end;

注意命名规范前面加J, 大小写保持后Java一致;

注意自定义标签写法

[JavaSignature('android/speech/tts/SynthesisCallback')]

3. 工厂类及delphi封装的调用类

TJSynthesisCallback = class(TJavaGenericImport) end;

注意以T打头;

l 类(java)

1. 类方法包装(继承JObjectClass)

2. 实例方法包装(继承JObject)

3. 工厂类及delphi封装的调用类与接口相同;

Java类中各类型Delphi在Androidapi.JNI.JavaTypes也做了相应的封装,也有相应对照表在源码注释中,可对照参考

JObject = interface;//java.lang.Object

JClassLoader = interface;//java.lang.ClassLoader

JInputStream = interface;//java.io.InputStream

JByteArrayInputStream = interface;//java.io.ByteArrayInputStream

JNumber = interface;//java.lang.Number

JInteger = interface;//java.lang.Integer

JBoolean = interface;//java.lang.Boolean

JByte = interface;//java.lang.Byte

JEnumeration = interface;//java.util.Enumeration

JCalendar = interface;//java.util.Calendar

JAbstractCollection = interface;//java.util.AbstractCollection

JAbstractSet = interface;//java.util.AbstractSet

JHashSet = interface;//java.util.HashSet

JAbstractList = interface;//java.util.AbstractList

JSerializable = interface;//java.io.Serializable

JEnum = interface;//java.lang.Enum

JThread_State = interface;//java.lang.Thread$State

JThread_UncaughtExceptionHandler = interface;//java.lang.Thread$UncaughtExceptionHandler

JFileDescriptor = interface;//java.io.FileDescriptor

JFile = interface;//java.io.File

JArrayList = interface;//java.util.ArrayList

JRunnable = interface;//java.lang.Runnable

JCloseable = interface;//java.io.Closeable

JWriter = interface;//java.io.Writer

JIterable = interface;//java.lang.Iterable

JCollection = interface;//java.util.Collection

JList = interface;//java.util.List

JOutputStream = interface;//java.io.OutputStream

Jlang_Class = interface;//java.lang.Class

JThrowable = interface;//java.lang.Throwable

JException = interface;//java.lang.Exception

JJSONException = interface;//org.json.JSONException

JUUID = interface;//java.util.UUID

JAbstractMap = interface;//java.util.AbstractMap

JHashMap = interface;//java.util.HashMap

JRandom = interface;//java.util.Random

JAnnotation = interface;//java.lang.annotation.Annotation

JThread = interface;//java.lang.Thread

JDate = interface;//java.util.Date

JFilterOutputStream = interface;//java.io.FilterOutputStream

JPrintStream = interface;//java.io.PrintStream

JRuntimeException = interface;//java.lang.RuntimeException

JObserver = interface;//java.util.Observer

JFloat = interface;//java.lang.Float

JDouble = interface;//java.lang.Double

JPrintWriter = interface;//java.io.PrintWriter

JIterator = interface;//java.util.Iterator

JListIterator = interface;//java.util.ListIterator

JByteArrayOutputStream = interface;//java.io.ByteArrayOutputStream

JStackTraceElement = interface;//java.lang.StackTraceElement

JFileOutputStream = interface;//java.io.FileOutputStream

JAbstractStringBuilder = interface;//java.lang.AbstractStringBuilder

JStringBuilder = interface;//java.lang.StringBuilder

JCharSequence = interface;//java.lang.CharSequence

JGregorianCalendar = interface;//java.util.GregorianCalendar

JJSONTokener = interface;//org.json.JSONTokener

JMap = interface;//java.util.Map

JLocale = interface;//java.util.Locale

JTimeZone = interface;//java.util.TimeZone

JFileFilter = interface;//java.io.FileFilter

JEnumSet = interface;//java.util.EnumSet

Jutil_Observable = interface;//java.util.Observable

JFilenameFilter = interface;//java.io.FilenameFilter

JJSONObject = interface;//org.json.JSONObject

JString = interface;//java.lang.String

JSet = interface;//java.util.Set

JShort = interface;//java.lang.Short

JThreadGroup = interface;//java.lang.ThreadGroup

JComparator = interface;//java.util.Comparator

JJSONArray = interface;//org.json.JSONArray

JLong = interface;//java.lang.Long

JFileInputStream = interface;//java.io.FileInputStream

JStringBuffer = interface;//java.lang.StringBuffer

此单元也包含了部分转换函数如StringToJString 各位可以跟进源码察看;

l 如何调用

直接看代码把

var

text : JString;

begin

tts := TJTextToSpeech.JavaClass.init(SharedActivityContext, ttsListener);

text := StringToJString('hello!');

tts.speak(text, TJTextToSpeech.JavaClass.QUEUE_FLUSH, nil);

end;

### 回答1: Delphi是一种基于Object Pascal编程语言的集成开发环境(IDE),而Java是一种基于面向对象的编程语言。在Delphi调用Java函数,需要使用Java类的调用方式。 1. 首先,在Delphi中需要使用Java类库时,需要将Java类库导入到Delphi项目中。可以通过在Delphi中创建Java类的接口来实现,然后通过接口调用Java类的函数。 2. 当Java类库已导入到Delphi项目中时,可以通过实例化Java类的对象来调用Java函数。可以使用Java中的反射机制,通过类的完全限定名来实例化对象,然后使用对象调用函数。 3. 在调用Java函数时,需要注意传递参数和返回值的处理。在Delphi中,参数的传递方式可能与Java中的不同,需要进行正确的转换和处理。同时,还需要根据Java函数的返回类型,对返回值进行正确的转换。 4. 在调用Java函数之前,需要确保Java虚拟机(JVM)已正确初始化。可以使用Delphi中的jni4delphi来实现与JVM的交互,并进行正确的初始化和释放处理。 通过以上步骤,就可以在Delphi中成功调用Java函数了。这样可以在Delphi项目中利用Java的强大功能和丰富的类库来实现更多的功能和扩展性。当然,在调用Java函数时,也需要充分理解Java的语法和规范,确保调用的准确性和稳定性。 ### 回答2: Delphi是一种编程语言和集成开发环境,而Java也是一种独立的编程语言。要在Delphi调用Java函数,可以使用Java Native Interface (JNI) 技术。 使用JNI可以允许Delphi与其他编程语言进行交互,包括Java。以下是调用Java函数的一般步骤: 1. 创建一个Java类或已有的Java类,其中包含要调用的函数。确保在Java类中使用public修饰符标记要调用的函数。 2. 在Delphi项目中导入JNI的相应单元,例如"jni.pas"。 3. 使用"TJavaVM"类来初始化Java虚拟机,并获取Java虚拟机实例。 4. 使用"AttachCurrentThread"函数将Delphi线程附加到Java虚拟机。 5. 使用"JNIEnv"结构体指针获取当前线程的环境。 6. 使用"FindClass"函数找到要调用Java类。 7. 使用"GetMethodID"函数获取要调用Java方法的ID。 8. 根据Java方法的返回类型和参数,使用相应的"Call"函数(如"CallStaticVoidMethod")调用Java方法。 9. 释放资源,包括解除线程附加和销毁Java虚拟机。 使用JNI时需要注意的一些问题包括确保DelphiJava代码之间的数据类型匹配,以及在JNI调用期间正确处理异常。建议在Delphi文档中查找更多关于JNI的使用方法和示例代码。 总结地说,在Delphi调用Java函数需要使用JNI技术来实现与Java之间的交互。以上是基本步骤的概述,具体的实现取决于要调用Java函数的返回类型和参数。使用JNI可以实现Delphi与其他编程语言之间的无缝集成。 ### 回答3: 在Delphi调用Java函数可以通过使用Java Native Interface(JNI)来实现。下面是具体步骤: 1. 首先,确保Java Development Kit(JDK)已经安装在计算机上,因为JNI需要使用JDK中的工具进行开发。 2. 在Delphi项目中添加JNI。可以从官方网站下载并安装JNI。 3. 编写Java代码,包括需要被调用的函数。确保将其编译为Java类文件(.class)。 4. 在Delphi项目中添加Java类文件的路径。这可以通过在Delphi的“Project Options”中的“Search Path”中添加类文件所在的文件夹来实现。 5. 在Delphi代码中使用JNI函数来调用Java函数。首先,创建一个Java虚拟机(JVM)实例,然后加载Java类文件并获取所需要调用Java方法的引用。最后,通过JNI函数来调用Java方法,并传递参数和获取返回值。 6. 确保在调用Java方法之前,先初始化JVM,并在使用完毕后释放JVM资源。 需要注意的是,Delphi中的数据类型与Java中的数据类型可能不完全匹配,因此可能需要进行类型转换。 总结起来,通过使用JNI和相关的函数,可以在Delphi调用Java的函数。通过遵循上述步骤,可以实现DelphiJava之间的交互,并进行函数调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值