昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成: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. Mvc-项目遇到问题解决办法

    项目中验证 在@using (Html.BeginForm()) 后边都有 @Html.ValidationSummary(), @Html.ValidationSummary(true, " ...

  2. 一个自定义线程池的小Demo

    在项目中如果是web请求时候,IIS会自动分配一个线程来进行处理,如果很多个应用程序共享公用一个IIS的时候,线程分配可能会出现一个问题(当然也是我的需求造成的) 之前在做项目的时候,有一个需求,就是 ...

  3. web开发基础(同步更新中)

    1/Get与Post的区别 GET是我们都熟悉的.它用于请求网页文本.当你在浏览器输入harvard.edu,它会直接访问Harvard的web服务器,去GET /. 第二个最有名的是POST,它经常 ...

  4. C# CRC校验的一点感悟

    今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...

  5. 使用Gulp构建本地开发Web服务器

    前端模拟ajax,就需要配置web服务器(apache,iis,nginx),有点麻烦 代码有一点点修改,就需要F5刷新页面很麻烦 Gulp + Gulp-connect + watch + live ...

  6. [Lua]表驱动索引编程,form.lua

    form.interface local form = {_tag = 'form'} function form.build(tag, super) --[[ -- form to produce ...

  7. JVM学习笔记-运行时数据区

    不同于C,C++程序,Java程序的内存管理工作由Java虚拟机(JVM)接管,这减低了java程序员的负担,但如果出现内存泄露与溢出问题如报OutOfMemory,StackOverFlow异常错误 ...

  8. 从一个标准 url 里取出文件的扩展名

    在php预定义函数中有一个叫做"pathinfo()"的函数,专门用于返回文件路径信息的. 那好,我们就来看一下它能为我们做些什么?       语法:pathinfo($url_ ...

  9. thinkphp路径引用问题

    查看ThinkPHP\Library\Behavior\ContentReplaceBehavior.class文件,常量定义如下定义: '__ROOT__'      =>  __ROOT__ ...

  10. Python 手册——解释器及其环境

    错误处理: 有错误发生时,解释器打印一个错误信息和栈跟踪(监视)器?.交互模式下,它返回主提示符,如果从文件 输入执行,它在打印栈跟踪器后以非零状态退出.(异常可以由try语句中的except子句来控 ...