学习使用Delphi for android 调用Java类库

http://blog.csdn.net/laorenshen/article/details/41148253

学习使用Delphi for android 调用Java类库

2014-11-15 18:36 1053人阅读 评论(0) 收藏 举报

 分类:

安卓开发(27) 

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<byte>; 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<JSynthesisCallbackClass, JSynthesisCallback>) end;

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

注意自定义标签写法

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

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

TJSynthesisCallback = class(TJavaGenericImport<JSynthesisCallbackClass, JSynthesisCallback>) 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;

时间: 2024-08-02 14:49:43

学习使用Delphi for android 调用Java类库的相关文章

Android学习JNI,使用C调用JAVA语言

本节学习使用C语言调用JAVA语言.在生活中比如我们某些底层的硬件必须使用C语言去编写,当C语言返回的某些数值显示在界面上时,就比如使用JNI.这样可以将C返回的值显示在界面上. 本节模拟传感器返回的值,通过进度条显示灵敏度,然后显示到界面上. 1:界面布局就补多说了.里面就2个Button,一个用于开启监控,一个用于关闭监控,一个进度条 2:Activity代码如下: //开始监控button public void start(View v) { startMonitor(); } //停止

2.7 学习总结 之【Android】java To Kotlin 一(初识)

一.Kotlin 的方便之处 1.Kotlin 可以直接使用id来呼叫操控相应的控件( textView.text = "0" )   java( TextView textView  =  findViewById(R.id.textView; textView.setText("0"); ) ) 原因:使用了Kotlin 的扩展的功能,import kotlinx.android.synthetic.main.activity_main.*,将界面上的控件和控制

Delphi XE5 Android 调用手机震动(通过JObject测试是否支持震动)

源码如下: [delphi] view plain copy uses Androidapi.JNI.Os, Androidapi.JNIBridge; function GetVibratorArray(const AIntArr: array of Int64): TJavaArray<Int64>; var LIndex: Integer; begin Result := TJavaArray<Int64>.Create(Length(AIntArr)); for LInde

转: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 { 创建 Ja

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

六、Android学习笔记_JNI_c调用java代码

1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // C调用java空方法 public void helloFromJava() { System.out.println("hello from java"); } // C调用java中的带两个int参数的方法 public int Add(int x, int y) { int res

Android学习笔记_JNI_c调用java代码

1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // C调用java空方法 public void helloFromJava() { System.out.println("hello from java"); } // C调用java中的带两个int参数的方法 public int Add(int x, int y) { int res

android NDK 实用学习(五)-c++端调用java接口

1,阅读此文章前请阅读前面文章,以免阅读出现障碍: android NDK 实用学习(一)-获取java端类及其类变量 android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值 android NDK 实用学习(三)- java端类对象的构造及使用 android NDK 实用学习(四)-类缓存 2,java端类接口定义: 1 public class RTKNativeManager { 2 // 其他接口 3 4 // 开给c++端的接口 5 public static