接上篇继续,说到通过已知的属性id取到对应的位置,却没有解决根据当前阅读页的段落位置或者笔记位置取到其属性id.这样就会造成一个问题,我只能用其他端的id来跳转到指定的位置阅读,自己却没有属性id来表示同步位置.
后来又无脑的翻找已一下,在JavaNativeFormatPlugin.cpp中找到相关的代码,initInternalHyperlinks()方法中的model.internalHyperlinks()就是存储了属性id与段落位置,在上篇中取到的id实际上也是这里持久化的产物.那么我只需将此处的id与位置关系回传给java层并保存下来就差不多了.至于是选择缓存到本地还是内存,还是根据实际情况来判断吧,我这就简单放在内存中.
相关回传的代码(不会c++,low代码别见笑)

static bool initInternalHyperlinks(JNIEnv *env, jobject javaModel, BookModel &model, const std::string &cacheDir) {ZLCachedMemoryAllocator allocator(131072, cacheDir, "nlinks");ZLUnicodeUtil::Ucs2String ucs2id;ZLUnicodeUtil::Ucs2String ucs2modelId;const std::map<std::string,BookModel::Label> &links = model.internalHyperlinks();std::map<std::string,BookModel::Label>::const_iterator it = links.begin();for (; it != links.end(); ++it) {const std::string &id = it->first;const BookModel::Label &label = it->second;//将解析的属性回传给java层的BookModel=====startJString idj(env, id.substr());AndroidUtil::Method_BookModel_AttrIds->call(javaModel, idj.j(), label.ParagraphNumber);//将解析的属性回传给java层的BookModel=====endif (label.Model.isNull()) {continue;}ZLUnicodeUtil::utf8ToUcs2(ucs2id, id);ZLUnicodeUtil::utf8ToUcs2(ucs2modelId, label.Model->id());const std::size_t idLen = ucs2id.size() * 2;const std::size_t modelIdLen = ucs2modelId.size() * 2;char *ptr = allocator.allocate(idLen + modelIdLen + 8);ZLCachedMemoryAllocator::writeUInt16(ptr, ucs2id.size());ptr += 2;std::memcpy(ptr, &ucs2id.front(), idLen);ptr += idLen;ZLCachedMemoryAllocator::writeUInt16(ptr, ucs2modelId.size());ptr += 2;std::memcpy(ptr, &ucs2modelId.front(), modelIdLen);ptr += modelIdLen;ZLCachedMemoryAllocator::writeUInt32(ptr, label.ParagraphNumber);}allocator.flush();JString linksDirectoryName(env, allocator.directoryName(), false);JString linksFileExtension(env, allocator.fileExtension(), false);jint linksBlocksNumber = allocator.blocksNumber();AndroidUtil::Method_BookModel_initInternalHyperlinks->call(javaModel, linksDirectoryName.j(), linksFileExtension.j(), linksBlocksNumber);return !env->ExceptionCheck();
}

其中AndroidUtil::Method_BookModel_AttrIds->call()方法请依葫芦画瓢!!!
然后在BookModel.java中定义方法接收

protected SparseArray<String> links = new SparseArray<>();
public void attrIds(String attrId, int paragraphIndex){if (attrId.contains("#")){//之所以这里有#号,可以看上篇的attrId组成links.put(paragraphIndex, attrId.split("#")[1]);}}

紧接着在需要的地方调用,即做到了通过id取位置,也可以做到通过位置取id

public int getParagraphIndexByAttrId(String attrId){if (links != null){int index = links.indexOfValue(attrId);return links.keyAt(index);}return -1;}public String getAttrIdByParagraphIndex(int paragraphIndex){if (links != null){return links.get(paragraphIndex);}return "";}

FBreader多端同步心得补充相关推荐

  1. 什么app能和PC端同步工作?手机电脑同步工作助手软件试试云便签

    对于上班族来说,手机和电脑都是日常要使用的电子设备,它们的功能和用途各有侧重点,在我们的生活和工作中是互为补充的.但有不少网友表示自己在工作的时候,经常需要手机和电脑不断的切换使用,其实这样不仅会增加 ...

  2. 工作中InnoDB引擎数据库主从复制同步心得

    近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别 ...

  3. 电脑桌面便签小工具_电脑桌面工作任务提醒软件有哪些?多端同步提醒办公软件试试云便签...

    有的人总是说自己的工作效率不够高,但是你问他平时都是怎么工作的,他也说不出个一二三来,只是说想起什么工作就去什么,这样毫无时间观念.对工作任务也没有整体认知的工作方式,工作效率当然不会高.甚至有时候快 ...

  4. netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果

    netty是一个异步通讯框架,在有的时候咱们想使用服务端向客户端发送消息,服务端同步等待客户端返回结果真进行下一步的业务逻辑操做.那要怎么作才能同步获取客户端返回的数据呢?这里我用到了JDK中的闭锁等 ...

  5. 介绍一个欧神写的剪贴板多端同步神器

    经常会遇到这样的场景:手机上看到某位大佬发了一段醍醐灌顶的话,马上想记录到自己的笔记系统里去.但电脑上并没有登录微信,所以还得先登录电脑端微信,再自动同步消息,找到那段话,复制,记录-- 如果我们用的 ...

  6. 实现Typora多端同步

    实现Typora多端同步 由于学习做笔记主要使用Typora,也用蛮久了不想换其他的软件,在实验室电脑上写的笔记难以同步到自己的电脑,百度了一下发现办法都很类似,通过图床+文本云盘存储实现,借此记录一 ...

  7. Zotero安装配置插件教程: 多端同步、自动翻译、抓取题录信息、参考文献等

    Zotero 作为一款文献管理软件,支持Windows.MacOs.Linux.IOS等,且可以保持多端同步,即在不同的设备和操作系统上(甚至包括网页版)能保持文献.笔记等内容的完全同步 选择 Zot ...

  8. 【多端同步-学习类】考试周必备神器~小番茄工作法 合理安排每一天

    听我来说 其实写这一篇的目的在于:帮助大家合理安排自己的时间,因为时间真的很宝贵.手机的普及使得我们越来越离不开手机,一有时间就控制不住自己的双手,打开某音 一刷一笑.回过神来发现:已经过去两个小时 ...

  9. 集成融云 SDK 怎么实现多端同步未读数

    最近在集成融云 SDK 的时候,碰到了一个跟未读数有关的问题,现象是这样的: 比如我在其中 Web 端已经清除了某个会话的未读数然后退出,再换个设备登入,这个时候未读数还有,并没有清除掉,我就纳闷了, ...

  10. 手机电脑同步的记事本app?多端同步的记事提醒办公软件可用云便签

    顾名思义,以前记事本是指用来记录各种事情的小本子,但是随着网络和科技的发展,现在使用电子版记事本的人越来越多了.我们一般可以在手机.电脑.ipad等电子设备中使用记事本软件,并且与纸质记事本相比,电子 ...

最新文章

  1. javascript计时器_JavaScript计时器:您需要了解的一切
  2. easyexcel导入时读不到数据_EasyExcel简单使用--导入excel数据
  3. objective-c中Category类别(扩展类)专题总结
  4. JS,JQ,PHP的小知识点整理
  5. javase阶段总结脑图
  6. vba htm转成图片_提取1000页PPT的图片,同事花了两小时,我只花了两分钟
  7. HR搬程序员椅子拍老板马屁,开怼的程序员被开?
  8. 方差分析 Analysis of Variance ANOVA 变异数分析 F检验
  9. 制作Android系统签名方法
  10. java 判断 string null_java 字符串为null 如何判断
  11. 京东区块链白皮书摘要
  12. linux sqlite图形工具,SQLite 图形化管理工具
  13. 面向初学者的 20 大人工智能项目创意
  14. 机器人技术(2)Ubuntu linux系统简介及安装
  15. 太厉害了,竟然用 Python 给英语老师开发了个英语作文批改的神器
  16. APT34泄密武器分析报告
  17. LeapFTP 3.0注册码
  18. 天下武功,唯快不破:后端Java人怎么提升自己的开发效率?
  19. SVN客户端使用教程
  20. 网页调用QQ聊天窗口

热门文章

  1. 深圳地铁五号线联网监控!
  2. LOGO特训营 第三节 首字母创意手法
  3. 全球市场喷干水果粉市场销售规模及投资盈利预测报告(新版)2022年
  4. Linux 修改环境变量设置的三种方式
  5. Kylin Linux V10升级gcc操作
  6. 多个模型融合训练神经网络-devise模型的实现
  7. 【参赛作品94】21天openGauss学习之旅
  8. vba中find方法查找
  9. 解决errno 256报错_wuli大世界_新浪博客
  10. c语言程序设计精髓第五章编程题