昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成:1.没有移植的 ZLTextView,2.FormatPlugin相关的类。
第一个问题我们放在后面解决,下面先解决格式插件的问题。
我们可以看出来,FBReader格式插件这一部分的设计是相当的牛X的,至少以我目前的水平看。我们来看看它插件的结构 使用tree命令
 
D:\WORKS\TEXTLAYOUT\FBREADERJ\SRC\ORG\GEOMETERPLUS\FBREADER\FORMATS
│ FormatPlugin.java
│ JavaFormatPlugin.java
│ NativeFormatPlugin.java
│ PluginCollection.java

├─fb2
│ Base64EncodedImage.java
│ FB2AnnotationReader.java
│ FB2CoverImage.java
│ FB2CoverReader.java
│ FB2MetaInfoReader.java
│ FB2NativePlugin.java
│ FB2Plugin.java
│ FB2Reader.java
│ FB2Tag.java
│ FB2TagManager.java
│ FB2Util.java

├─html
│ HtmlReader.java
│ HtmlTag.java

├─oeb
│ ContainerFileReader.java
│ NCXReader.java
│ OEBAnnotationReader.java
│ OEBBookReader.java
│ OEBCoverBackgroundReader.java
│ OEBCoverReader.java
│ OEBMetaInfoReader.java
│ OEBNativePlugin.java
│ OEBPlugin.java
│ XHTMLImageFinder.java

├─pdb
│ DocDecompressor.java
│ HuffdicDecompressor.java
│ MobipocketHtmlBookReader.java
│ MobipocketPlugin.java
│ MobipocketStream.java
│ PalmDocLikeStream.java
│ PdbHeader.java
│ PdbStream.java
│ PdbUtil.java

├─util
│ MiscUtil.java

└─xhtml
XHTMLReader.java
XHTMLTagAction.java
XHTMLTagBodyAction.java
XHTMLTagControlAction.java
XHTMLTagHyperlinkAction.java
XHTMLTagImageAction.java
XHTMLTagItemAction.java
XHTMLTagParagraphAction.java
XHTMLTagParagraphWithControlAction.java
XHTMLTagPreAction.java
XHTMLTagRestartParagraphAction.java
我们可以看出formats下有四个格式文件夹,分别支持了各自的文件格式,而根目录下的四个文件很清楚的解释了它的插件管理方法,每种格式的插件分为Java实现和Native实现,并且这两种实现是可以切换的,插件都存储在PluginCollection这个类里,这个类可以根据文件类型去查找可用的插件,使用插件来进行解析。
那么,我们按照原样把这一部分代码拷贝到我们的工程对应的目录下。
现在,我们有了解析格式的利器了,是时候解决最后一个问题了,ZLTextView带来的关联问题,ZLTextView是解析与排版直接的连接枢纽,引入这个文件,我们就要开始进入排版代码了,因此我觉得先使用一个适配器来代替ZLTextView,是我们的代码内聚在现有的模块内,起码先使其可以运行,所以创建了一个ZLTextView的抽象子类MyViewAdapter。
好了,现在我们的代码看上去是这个样子了:
文件夹 PATH 列表
卷序列号为  9EB8:DA5D
D:\WORKS\TEXTLAYOUT\NEWREADERSE\SRC
├─com
│ └─yueang
│ ├─atest
│ │ TestEngine.java
│ │
│ ├─log
│ │ MyLog.java
│ │ MyUtils.java
│ │
│ ├─newreader
│ │ │ Paths.java
│ │ │
│ │ ├─book
│ │ │ Author.java
│ │ │ Book.java
│ │ │ Bookmark.java
│ │ │ BookmarkQuery.java
│ │ │ BooksDatabase.java
│ │ │ BookUtil.java
│ │ │ FileInfo.java
│ │ │ FileInfoSet.java
│ │ │ HighlightingStyle.java
│ │ │ Series.java
│ │ │ SeriesInfo.java
│ │ │ Tag.java
│ │ │ UID.java
│ │ │
│ │ ├─bookmodel
│ │ │ BookModel.java
│ │ │ BookModelImpl.java
│ │ │ BookReader.java
│ │ │ BookReadingException.java
│ │ │ FBHyperlinkType.java
│ │ │ FBTextKind.java
│ │ │ JavaBookModel.java
│ │ │ NativeBookModel.java
│ │ │ TOCTree.java
│ │ │
│ │ ├─formats
│ │ │ │ FormatPlugin.java
│ │ │ │ JavaFormatPlugin.java
│ │ │ │ NativeFormatPlugin.java
│ │ │ │ PluginCollection.java
│ │ │ │
│ │ │ ├─fb2
│ │ │ │ Base64EncodedImage.java
│ │ │ │ FB2AnnotationReader.java
│ │ │ │ FB2CoverImage.java
│ │ │ │ FB2CoverReader.java
│ │ │ │ FB2MetaInfoReader.java
│ │ │ │ FB2NativePlugin.java
│ │ │ │ FB2Plugin.java
│ │ │ │ FB2Reader.java
│ │ │ │ FB2Tag.java
│ │ │ │ FB2TagManager.java
│ │ │ │ FB2Util.java
│ │ │ │
│ │ │ ├─html
│ │ │ │ HtmlReader.java
│ │ │ │ HtmlTag.java
│ │ │ │
│ │ │ ├─oeb
│ │ │ │ ContainerFileReader.java
│ │ │ │ NCXReader.java
│ │ │ │ OEBAnnotationReader.java
│ │ │ │ OEBBookReader.java
│ │ │ │ OEBCoverBackgroundReader.java
│ │ │ │ OEBCoverReader.java
│ │ │ │ OEBMetaInfoReader.java
│ │ │ │ OEBNativePlugin.java
│ │ │ │ OEBPlugin.java
│ │ │ │ XHTMLImageFinder.java
│ │ │ │
│ │ │ ├─pdb
│ │ │ │ DocDecompressor.java
│ │ │ │ MobipocketHtmlBookReader.java
│ │ │ │ MobipocketPlugin.java
│ │ │ │ MobipocketStream.java
│ │ │ │ PalmDocLikeStream.java
│ │ │ │ PdbHeader.java
│ │ │ │ PdbStream.java
│ │ │ │ PdbUtil.java
│ │ │ │
│ │ │ ├─util
│ │ │ │ MiscUtil.java
│ │ │ │
│ │ │ └─xhtml
│ │ │ XHTMLReader.java
│ │ │ XHTMLTagAction.java
│ │ │ XHTMLTagBodyAction.java
│ │ │ XHTMLTagControlAction.java
│ │ │ XHTMLTagHyperlinkAction.java
│ │ │ XHTMLTagImageAction.java
│ │ │ XHTMLTagItemAction.java
│ │ │ XHTMLTagParagraphAction.java
│ │ │ XHTMLTagParagraphWithControlAction.java
│ │ │ XHTMLTagPreAction.java
│ │ │ XHTMLTagRestartParagraphAction.java
│ │ │
│ │ ├─network
│ │ │ Base64EncodedImage.java
│ │ │
│ │ └─sort
│ │ TitledEntity.java
│ │
│ ├─support
│ │ Environment.java
│ │ MyAssetFile.java
│ │ MyViewAdapter.java
│ │ MyZLibrary.java
│ │ ZLSELibrary.java
│ │
│ └─zlibrary
│ ├─core
│ │ ├─config
│ │ │ ZLConfig.java
│ │ │
│ │ ├─constants
│ │ │ XMLNamespaces.java
│ │ │
│ │ ├─encoding
│ │ │ AutoEncodingCollection.java
│ │ │ Encoding.java
│ │ │ EncodingCollection.java
│ │ │ EncodingConverter.java
│ │ │ FilteredEncodingCollection.java
│ │ │ JavaEncodingCollection.java
│ │ │
│ │ ├─filesystem
│ │ │ │ ZLArchiveEntryFile.java
│ │ │ │ ZLFile.java
│ │ │ │ ZLPhysicalFile.java
│ │ │ │ ZLResourceFile.java
│ │ │ │ ZLZipEntryFile.java
│ │ │ │
│ │ │ └─tar
│ │ │ ZLTarEntryFile.java
│ │ │ ZLTarHeader.java
│ │ │ ZLTarInputStream.java
│ │ │
│ │ ├─filetypes
│ │ │ FileType.java
│ │ │ FileTypeCollection.java
│ │ │ FileTypeDjVu.java
│ │ │ FileTypeEpub.java
│ │ │ FileTypeFB2.java
│ │ │ FileTypeHtml.java
│ │ │ FileTypeMobipocket.java
│ │ │ FileTypePalm.java
│ │ │ SimpleFileType.java
│ │ │
│ │ ├─html
│ │ │ ZLByteBuffer.java
│ │ │ ZLHtmlAttributeMap.java
│ │ │ ZLHtmlParser.java
│ │ │ ZLHtmlProcessor.java
│ │ │ ZLHtmlReader.java
│ │ │
│ │ ├─image
│ │ │ ZLBase64EncodedImage.java
│ │ │ ZLFileImage.java
│ │ │ ZLImage.java
│ │ │ ZLImageData.java
│ │ │ ZLImageManager.java
│ │ │ ZLImageProxy.java
│ │ │ ZLLoadableImage.java
│ │ │ ZLSingleImage.java
│ │ │
│ │ ├─language
│ │ │ Language.java
│ │ │ ZLLanguageUtil.java
│ │ │
│ │ ├─library
│ │ │ ZLibrary.java
│ │ │
│ │ ├─options
│ │ │ ZLOption.java
│ │ │ ZLStringOption.java
│ │ │
│ │ ├─resources
│ │ │ ZLMissingResource.java
│ │ │ ZLResource.java
│ │ │ ZLTreeResource.java
│ │ │
│ │ ├─tree
│ │ │ ZLTree.java
│ │ │
│ │ ├─util
│ │ │ Base64InputStream.java
│ │ │ HexInputStream.java
│ │ │ MergedInputStream.java
│ │ │ MimeType.java
│ │ │ MiscUtil.java
│ │ │ SliceInputStream.java
│ │ │ ZLArrayUtils.java
│ │ │ ZLBoolean3.java
│ │ │ ZLColor.java
│ │ │ ZLInputStreamWithOffset.java
│ │ │ ZLSearchPattern.java
│ │ │ ZLSearchUtil.java
│ │ │
│ │ └─xml
│ │ ZLDTDParser.java
│ │ ZLMutableString.java
│ │ ZLStringMap.java
│ │ ZLXMLParser.java
│ │ ZLXMLProcessor.java
│ │ ZLXMLReader.java
│ │ ZLXMLReaderAdapter.java
│ │
│ └─text
│ ├─model
│ │ CachedCharStorage.java
│ │ CachedCharStorageBase.java
│ │ CachedCharStorageException.java
│ │ CachedCharStorageRO.java
│ │ CharStorage.java
│ │ ZLImageEntry.java
│ │ ZLTextCSSStyleEntry.java
│ │ ZLTextMark.java
│ │ ZLTextMetrics.java
│ │ ZLTextModel.java
│ │ ZLTextNativeModel.java
│ │ ZLTextOtherStyleEntry.java
│ │ ZLTextParagraph.java
│ │ ZLTextParagraphImpl.java
│ │ ZLTextPlainModel.java
│ │ ZLTextSpecialParagraphImpl.java
│ │ ZLTextStyleEntry.java
│ │ ZLTextWritableModel.java
│ │ ZLTextWritablePlainModel.java
│ │
│ └─view
│ ZLPaintContext.java
│ ZLTextControlElement.java
│ ZLTextElement.java
│ ZLTextFixedHSpaceElement.java
│ ZLTextFixedPosition.java
│ ZLTextHyperlink.java
│ ZLTextHyperlinkControlElement.java
│ ZLTextImageElement.java
│ ZLTextParagraphCursor.java
│ ZLTextParagraphCursorCache.java
│ ZLTextPosition.java
│ ZLTextStyleElement.java
│ ZLTextWord.java
│ ZLTextWordCursor.java

└─org
├─amse
│ └─ys
│ └─zip
│ Decompressor.java
│ DeflatingDecompressor.java
│ LocalFileHeader.java
│ MyBufferedInputStream.java
│ NoCompressionDecompressor.java
│ ZipException.java
│ ZipFile.java
│ ZipInputStream.java

└─vimgadgets
└─linebreak
LineBreaker.java
 
atest包是我们测测试程序入口,Log包下是自定义的Log类
 
运行TestEngine,出现UnsatisfyLinkError, 查了一下原来是没有实现org.amse.ys.zip.DeflatingDecompressor类中的本地方法,下载win32版的 zlib库,创建VS工程,加入jni/DeflatingDecompressor/DeflatingDecompressor.cpp文件,编译出dll,  然后把FBReaderJ/assets 文件夹也拷贝到工程里,实现我们自己的MyAssetFile extends ZLResrourceFile类,使用该类来读取assets文件下的文件。
至此,我们移植了解析部分。
庆祝一下~~

FBReader移植日记 第二天的更多相关文章

  1. FBReader移植日记 第一天

    1.目标是创建两个工程,一个j2se的桌面软件,用于编辑和预览epub等格式的电子书,预览的窗口可以设置分辨率来模拟不同的设备,把编辑的结果实时的显示出来.另一个是Android的应用,用于阅读,管理 ...

  2. Egret入门学习日记 --- 第二十篇(书中 9.1~9.3 节 内容 组件篇)

    第二十篇(书中 9.1~9.3 节 内容 组件篇) 第八章中的内容. 以上都是基本的Js知识,我就不录入了. 直接来看 第9章. 开始 9.1节. 以上内容告诉你,Egret官方舍弃了GUI,使用了E ...

  3. Egret入门学习日记 --- 第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容)

    第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容) 既然选好了Egret,那我就要想想怎么学了. 开始第一步,先加个Q群先,这不,拿到了一本<E ...

  4. 淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播特效制作 (二)

    1.我们来设计flash_slide.xml 布局,这个xml主要做成模块化,方便其它的activity可以动态去调用. flash_slide.xml内容如下: <?xml version=& ...

  5. ASP.NET MVC5 高级编程-学习日记-第二章 控制器

    2.1 控制器的角色 MVC模式中的控制器(Controller)主要负责响应用户的输入,冰球在响应时修改模型(Model).通过这种方式,MVC模式中的控制器主要关注的是应用程序流.输入数据的处理, ...

  6. 安卓学习日记第二天——Fragment

    一.基本概念 Fragment是依赖于Activity的,不能独立存在的. 一个Activity里可以有多个Fragment. 一个Fragment可以被多个Activity重用. Fragment有 ...

  7. ffmpeg之移植到ARM

    移植方法分为两种:第一种手工移植,第二种buildroot移植. 第一种手工移植: 优点:灵活性高 缺点:重复工作多 一.配置 ./configure --enable-memalign-hack - ...

  8. JavaWeb学习日记----XML基础

    1.XML基础: XML全称为eXtensible Markup Language;即可扩展标记型语言,同HTML一样使用标签来操作.它的可扩展性体现在标签可以由自己定义,可以是中文标签. XML用途 ...

  9. webservice安全性之 SoapHeader自定义身份验证

    相信很多开发者都用过WebService来实现程序的面向服务,本文主要介绍WebService的身份识别实现方式,当然本文会提供一个不是很完善的例子,权当抱砖引玉了. 首先我们来介绍webservic ...

随机推荐

  1. SQL反模式部分内容笔记

    规范化: 1, 以一种我们能够理解的方式表达这个世界中的事物; 2, 减少数据冗余存储, 防止异常或者不一致的数据; 3, 支持完整性约束.  Tips: 提高数据的性能不在此列表中. 意义: 规范化 ...

  2. .NET生成静态页面例子

    主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...

  3. Net常用资源小集

    Visual Studio——IDEs工具之王,.NET开发者的必备IDE.Visual Studio提供非常强大的启动工具箱,并且还有一些让人惊喜的插件支持.在去年,微软发布了Visual Stud ...

  4. PHP导出excel信息表格

    //导出表格public function get_exel($fileName,$headArr,$list){//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能import导入 ...

  5. php批量发送短信或邮件的方案

    最近遇到在开发中遇到一个场景,后台管理员批量审核用户时候,需要给用户发送审核通过信息,有人可能会想到用foreach循环发送,一般的短信接口都有调用频率,循环发送,肯定会导致部分信息发送失败,有人说用 ...

  6. CURL传输与获取功能

    什么是CURL? 利用URL语法爱命令行方式下工作的文件传输工具.它支持很多协议.它支持认证功能.php中常用都实现更复杂的传输功能. 实现的功能: 1.实现远程获取和采集内容 2.实现PHP 网页版 ...

  7. C语言的编译过程和GCC编译参数

    C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注 ...

  8. Makefile的简单例子

    1.生成test可执行文件,源文件有prog.c prog.h cord.h test:prog.o code.o gcc -o test prog.o code.o prog.o:prog.c pr ...

  9. Ubuntu系统启动错误问题的解决

    一.hub_port_status failed (err=-110) 1.问题产生的原因 笔者不知道出现这种错误是不是都是相同的原因,但是我的系统出现这种原因是由于: 1.更改了虚拟硬盘的大小和/e ...

  10. ASP.NET MVC轻教程 Step By Step 11——数据注解

    将验证规则写在Cotroller里不是一个好办法,这样会显得代码很啰嗦,更重要的是将业务逻辑写入Controller,使得Controller变得更“重”,不符合设计原则.更好的办法是使用验证注解属性 ...