学习使用Delphi for android 调用Java类库
http://blog.csdn.net/laorenshen/article/details/41148253
学习使用Delphi for android 调用Java类库

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类库的更多相关文章
- Delphi XE5 for android 调用Java类库必看的文件
C:\Program Files\Embarcadero\RAD Studio\12.0\source\rtl\android 的目录 Androidapi.AppGlue.pasAndroidapi ...
- php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,该怎么解决
php通过JavaBridge调用Java类库和不带包的自定义java类成功 但是调用带包的自定义Java类报错,Class.forName("com.mysql.jdbc.Driver&q ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...
- Android NDK 学习之在C中调用Java的变量和静态变量
本博客主要是在Ubuntu 下开发,且默认你已经安装了Eclipse,Android SDK, Android NDK, CDT插件. 在Eclipse中添加配置NDK,路径如下Eclipse-> ...
- Android(java)学习笔记54:Android 调用Vibrator震动功能
1. 之前我编写的代码是如下: package com.himi.vibrate; import android.app.Activity; import android.app.Service; i ...
- Delphi XE5 Android 调用 Google ZXing
{ Google ZXing Call demo Delphi Version: Delphi XE5 Version 19.0.13476.4176 By: flcop(zylove619@hotm ...
- delphi xe5 android 调用照相机获取拍的照片
本篇文章我们来看一下delphi xe5 在android程序里怎样启动照相机并获取所拍的照片,本代码取自xe自带打sample,路径为: C:\Users\Public\Documents\RAD ...
- Android调用Java WebSevice篇之二
1.创建Activity. package com.web; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapO ...
- 2.7 学习总结 之【Android】java To Kotlin 一(初识)
一.Kotlin 的方便之处 1.Kotlin 可以直接使用id来呼叫操控相应的控件( textView.text = "0" ) java( TextView textVie ...
随机推荐
- SpringBoot(七) -- 嵌入式Servlet容器
一.嵌入式Servlet容器 在传统的开发中,我们在完成开发后需要将项目打成war包,在外部配置好TomCat容器,而这个TomCat就是Servlet容器.在使用SpringBoot开发时,我们无需 ...
- C++对象构造时,构造函数运行时并不知道VT的存在
class A {public: A() { init(); } virtual void init() { printf("A::init\n"); }}; class B : ...
- for循环延伸
经典面试题解析: for(var i = 1 ; i < 5 ; i++){ console.log(i) } //1 2 3 4 ------------------------------- ...
- 行人重识别(ReID) ——技术实现及应用场景
导读 跨镜追踪(Person Re-Identification,简称 ReID)技术是现在计算机视觉研究的热门方向,主要解决跨摄像头跨场景下行人的识别与检索.该技术能够根据行人的穿着.体态.发型等信 ...
- Dubbo学习源码总结系列四--集群容错机制
Dubbo提供了哪些集群容错机制?如何实现的? 提供了六种集群容错机制,包括Failover(失败自动切换,尝试其他服务器).Failfast(失败立即抛出异常).Failsafe(失 ...
- python中的垃圾回收机制及原理
序言: 来一起看看: 不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的 ...
- 了解Greenplum(1)
了解系列废话: 数据管理系统实现,以Greenplum作为课后实验,这里将实验报告贴出来,纯粹灌水. 1.Greenplum架构 如上图所示,GP的基本结构是单master,多slave节点,客户端连 ...
- BZOJ 1911 特别行动队 (斜率优化)
$ BZOJ~1911~*~ $ 特别行动队: (斜率优化) $ solution: $ 感觉这道题目还是比较常规的,首先我们很容易想到DP,因为题目里面说了选出的人都是连续的,这意味着我们可以从前往 ...
- 覆盖(Override)和重写(Overload)的区别
Overload Overload是重载的意思. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). Overload对我们来说可能比较 ...
- django之配置文件setting.py
一:配置文件setting.py中的简单配置更改 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 简单解释 ...