昨天我们的移植工作进行了一大半,还留下两个重要的部分没有完成: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. C#设置与获取目录权限(.net控制ACL)

    找到两种方式可以修改文件夹的权限 第一种: 想用c#来设置和读取ntfs分区上的目录权限,找了很多资料,未果.终于发现了一段vb.net的代码,做了修改,以C#展示给大家. using System; ...

  2. Visual C++ 编程实现Soft AP (HostedNetwork / 承载网络) 功能

    从Windows 7开始,微软在操作系统中加入的Soft AP功能,使用户能够通过无线网卡,开启虚拟AP,从而实现网络共享.Soft AP又称HostedNetwork(承载网络),在Windows ...

  3. boost::thread boost库线程

    一.boost::thread的创建 1.线程创建方法一: boost::shared_ptr<boost::thread> writeThread_; boost::function0& ...

  4. jquery 三种开始写法

    在 jquery 代码中使用 $(document).ready()时,位于其中的所有代码都会在 DOM 加载后立即执行 第一种(推荐)$(document).ready(function(){   ...

  5. configure: error: Cannot find libmysqlclient under /usr Note that the MySQL client library is not bundled anymore! 报错解决

    错误说明 今天在centos 6.3 64位版本上安装PHP5.4.3时在./configure 步骤的时候出现了下面错误configure: error: Cannot find libmysqlc ...

  6. apache日志文件 accesslog

    因为想要看到apache的日志记录用户请求某个页面所花的时间,需要添加额外参数才会记录,所以临时查了下哦..记下来了 在httpd.conf里可以看到一行这样的配置 LogFormat "% ...

  7. python【第十二篇】Mysql基础

    内容: 1.数据库介绍及MySQL简介 2.MySQL基本操作 1 数据库介绍 1.1什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 ...

  8. WebApi(一)-实现跨域返回格式支持json

    1.创建webapi

  9. Tomcat启动分析(Tomcat7.0)

    1)bin目录下的bootstrap.jar中的main方法启动Tomcat org.apache.catalina.startup.Bootstrap类下的main方法 可以看到Bootstrap类 ...

  10. Python/Keras如何将给定的数据集打乱

    给定数据集data,数据集对应的标签label index = [i for i in range(len(data))] random.shuffle(index) data = data[inde ...