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;

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

  1. Delphi XE5 for android 调用Java类库必看的文件

    C:\Program Files\Embarcadero\RAD Studio\12.0\source\rtl\android 的目录 Androidapi.AppGlue.pasAndroidapi ...

  2. php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决

    php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...

  3. Android调用Java WebSevice篇之一

    一.服务端WebService 1.服务端环境配置          MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...

  4. Android NDK 学习之在C中调用Java的变量和静态变量

    本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...

  5. Android(java)学习笔记54:Android 调用Vibrator震动功能

    1. 之前我编写的代码是如下: package com.himi.vibrate; import android.app.Activity; import android.app.Service; i ...

  6. Delphi XE5 Android 调用 Google ZXing

    { Google ZXing Call demo Delphi Version: Delphi XE5 Version 19.0.13476.4176 By: flcop(zylove619@hotm ...

  7. delphi xe5 android 调用照相机获取拍的照片

    本篇文章我们来看一下delphi xe5 在android程序里怎样启动照相机并获取所拍的照片,本代码取自xe自带打sample,路径为: C:\Users\Public\Documents\RAD ...

  8. Android调用Java WebSevice篇之二

    1.创建Activity. package com.web; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapO ...

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

    一.Kotlin 的方便之处 1.Kotlin 可以直接使用id来呼叫操控相应的控件( textView.text = "0" )   java( TextView textVie ...

随机推荐

  1. Centos 7下Hadoop分布式集群搭建

    一.关闭防火墙(直接用root用户) #关闭防火墙 sudo systemctl stop firewalld.service #关闭开机启动 sudo systemctl disable firew ...

  2. asp.net中的<% %>,<%= %>,<%# %><%$ %>的使用

    原文:https://www.cnblogs.com/Hackerman/p/3857630.html 首先我们来看一下<% %>的使用 在aspx的页面中只能使用服务器控件和一般的控件, ...

  3. Java缓存Ehcache-Ehcache的Cache在SSM框架中的配置

    需要在Spring配置文件中配置: <!-- 配置缓存管理器工厂 --> <bean id="cacheManager" class="org.spri ...

  4. 剑指offer学习--实现单例模式

    只能生成一个实例的类是为了实现单例模式的类型. 加同步锁前后两次判断实例是否已存在 我们只是在实例还没有创建之前加锁操作,以保证只有一个线程创建出实例.而当实例已经创建之后,我们已经不需要再做加锁操作 ...

  5. sqoop使用中文手册

    文章转载自:http://www.zihou.me/html/2014/01/28/9114.html 1.     概述 本文档主要对SQOOP的使用进行了说明,参考内容主要来自于Cloudera ...

  6. c# Winform 调用可执行 exe 文件

    c#是一个写windows桌面小工具的好东西,但有个时候,我们需要在 winform 程序中调用其他的 exe 文件,那么该如何实现呢? 如果只是拉起一个 exe 文件,可以参考如下方法实现: str ...

  7. KNN算法项目实战——改进约会网站的配对效果

    KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...

  8. python面向对象的三大特征--继承子类调用父类方法

    #在子类中调用父类方法 class Vehicle: country="China" def __init__(self,name,speed,load,power): self. ...

  9. MYSQL学习笔记——数据类型

    mysql的数据类型可以分为三大类,分别是数值数据类型.字符串数据类型以及日期时间数据类型. 数值数据类型                                               ...

  10. python3-定义函数

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...