首页> 中国专利> 原生方式访问资源的方法、Java端、原生端及系统

原生方式访问资源的方法、Java端、原生端及系统

摘要

本发明涉及通讯领域,具体涉及原生方式访问资源的方法、Java端、原生端及系统。该方法包括:Java端获取上下文对象;Java端将上下文对象通过JNI传递到原生端;原生端获得上下文对象后将上下文对象进行保存;原生端通过保存的上下文对象,调用getResource方法获得资源管理器;原生端通过资源管理器方法打开待读取资源;原生端获得输入流,通过输入流读取待读取资源的数据。Java端包括第一获取组件、传递组件。原生端包括:第二获取组件、调用组件、打开组件、读取组件;原生方式访问资源的系统包括:Java端和原生端。本发明方式简单,直接,没有额外的开销,节省了内存和时间,性能高。

著录项

  • 公开/公告号CN103279382A

    专利类型发明专利

  • 公开/公告日2013-09-04

    原文格式PDF

  • 申请/专利权人 北京微云即趣科技有限公司;

    申请/专利号CN201310154461.X

  • 发明设计人 马若劼;

    申请日2013-04-27

  • 分类号G06F9/46(20060101);

  • 代理机构北京超凡志成知识产权代理事务所(普通合伙);

  • 代理人吴开磊

  • 地址 100190 北京市海淀区知春路51号1号楼一层东侧

  • 入库时间 2024-02-19 20:03:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-04-04

    未缴年费专利权终止 IPC(主分类):G06F 9/46 专利号:ZL201310154461X 申请日:20130427 授权公告日:20161228

    专利权的终止

  • 2016-12-28

    授权

    授权

  • 2013-10-09

    实质审查的生效 IPC(主分类):G06F9/46 申请日:20130427

    实质审查的生效

  • 2013-09-04

    公开

    公开

说明书

技术领域

本发明涉及通讯领域,具体而言,涉及原生方式访问资源的方 法、Java端、原生端及系统。

背景技术

现有的Android系统,主要通过两种方式来访问Android资源, 方式一为通过Java端打开资源流,传递给原生端,原生端通过JNI 方式读取资源内容;方式二Java端只传递APK路径给原生端,原 生端通过libzip直接读取资源内容。这两种方式均导致Android性 能较差,在Java端打开,原生端调用JNI都需要耗费额外的内存和 时间,而且,需要包含额外的libzip库,代码更加复杂,且需要了 解APK文件路径,增加了代码维护难度,性能上存在问题,因为需 要解析APK,如果APK较大,速度会相应变慢。

发明内容

本发明的目的在于提供原生方式访问资源的方法、Java端、原 生端及系统,以解决上述的问题。

在本发明的实施例中提供了一种原生方式访问资源的方法,包 括:

Java端获取上下文对象;

所述Java端将所述上下文对象通过JNI传递到原生端;

所述原生端获得所述上下文对象后将所述上下文对象进行保 存;

所述原生端通过保存的所述上下文对象,调用getResource方法 获得资源管理器;

所述原生端通过资源管理器的方法打开待读取资源;

所述原生端获得输入流,通过所述输入流读取所述待读取资源 的数据。

所述待读取资源的描述方式优选包括以下任一种:路径方式、 资源标识ID方式。

所述原生端通过资源管理器的方法打开待读取资源优选包括:

所述原生端通过Android的资源类ResTable的getResource方 法获得所述待读取资源的区块、所述数据;

所述原生端通过所述区块,使用ResTable的resolveReference 方法获得所述待读取资源的真正区块位置;

若所述真正区块位置有效,通过ResTable的getTableCookie方 法获得所述待读取资源的句柄;

所述原生端通过ResTable的getTableStringBlock方法,以所述 区块为参数,获得所述待读取资源的真实路径。

所述原生端获得输入流优选包括:

所述原生端根据所述真实路径和所述句柄,通过Assert的 openNonAsset方法打开所述待读取资源的输入流。

所述原生端通过Android的资源类ResTable的getResource方 法获得所述待读取资源的区块、所述数据之前,所述原生端通过资 源管理器的方法打开待读取资源优选还包括:通过编译对应不同版 本的Android的getResource来完成对不同版本Android的适配。

本发明的一个实施例还提供一种根据上述任一项所述的原生方 式访问资源的方法的Java端,

包括第一获取组件、传递组件;

所述第一获取组件,用于获取上下文对象;

所述传递组件,用于将所述上下文对象通过JNI传递到原生端。

本发明的一个实施例中还提供了一种上述任一项所述的原生方 式访问资源的方法的原生端,

包括:第二获取组件、调用组件、打开组件、读取组件;

所述第二获取组件,用于获得所述上下文对象后将所述上下文 对象进行保存;

所述调用组件,用于通过所述上下文对象,调用getResource 方法获得资源管理器;

所述打开组件,用于通过资源管理器的方法打开待读取资源;

所述读取组件,用于获得输入流,通过所述输入流读取所述待 读取资源的数据。

所述打开组件优选包括:第三获取组件、第四获取组件、第五 获取组件、第六获取组件;

所述第三获取组件,用于通过Android的资源类ResTable的 getResource方法获得所述待读取资源的区块、所述数据;

所述第四获取组件,用于通过所述区块,使用ResTable的 resolveReference方法获得所述待读取资源的真正区块位置;

所述第五获取组件,用于若所述真正区块位置有效,通过 ResTable的getTableCookie方法获得所述待读取资源的句柄;

所述第六获取组件,用于通过ResTable的getTableStringBlock 方法,以所述区块为参数,获得所述待读取资源的真实路径。

所述读取组件,优选用于根据所述真实路径和所述句柄,通过 Assert的openNonAsset方法打开所述待读取资源的输入流。

本发明一个实施例中还提供了一种所述的方法的原生方式访问 资源的系统,

包括:上述的Java端、上述任一项所述的原生端。

本发明上述实施例的原生方式访问资源的方法、Java端、原生 端及系统,从原生端访问Android资源,只需Java传入上下文对象, 不依赖于APK具体位置,从原生端读取资源,保证读取的效率和灵 活性,减少Java端的依赖性,提高代码模块化程度,通过原生端访 问资源读取资源的方式简单,直接,没有额外的开销,节省了内存 和时间,性能高。

附图说明

图1示出了一个实施例中原生方式访问资源的方法的流程示意 图;

图2示出了图1步骤105的动态载入方式流程示意图;

图3示出了一个实施例中对应动态载入方式打开和读取资源的 架构。

具体实施方式

下面通过具体的实施例子并结合附图对本发明做进一步的详细 描述。

本发明的一个实施例提供了一种原生方式访问资源的方法,包 括:

Java端获取上下文对象;

所述Java端将所述上下文对象通过JNI传递到原生端;

所述原生端获得所述上下文对象后将所述上下文对象进行保 存;

所述原生端通过保存的所述上下文对象,调用getResource方法 获得资源管理器;

所述原生端通过资源管理器的方法打开待读取资源;

所述原生端获得输入流,通过所述输入流读取所述待读取资源 的数据。

本发明的一个实施例还提供了一种对应上述方法的Java端,包 括第一获取组件、传递组件;

所述第一获取组件,用于获取上下文对象;

所述传递组件,用于将所述上下文对象通过JNI传递到原生端。

本发明的一个实施例还提供了一种对应上述方法的原生端,包 括:第二获取组件、调用组件、打开组件、读取组件;

所述第二获取组件,用于获得所述上下文对象后将所述上下文 对象进行保存;

所述调用组件,用于通过所述上下文对象,调用getResource 方法获得资源管理器;

所述打开组件,用于通过资源管理器的方法打开待读取资源;

所述读取组件,用于获得输入流,通过所述输入流读取所述待 读取资源的数据。

本发明一个实施例中还提供了一种对应上述的方法的原生方式 访问资源的系统,

包括:上述的Java端、上述任一项所述的原生端。

本发明上述实施例的原生方式访问资源的方法、Java端、原生 端及系统,从原生端访问Android资源,只需Java传入上下文对象, 不依赖于APK具体位置,从原生端读取资源,保证读取的效率和灵 活性。

接下来,本发明将通过一些具体的实施方式来详细描述原生方 式访问资源的方法:

上述方法是对应在Android上通过原生方式访问资源的方法, 发明点之一:只需要Java端传入上下文对象,不依赖与APK具体 位置,减小Java端的依赖,提高代码模块化程度。

发明点之二:通过调用Android私有的API实现从原生端读取 资源,保证读取的效率和灵活性。

发明点之三:在不影响上层应用的情况下,动态载入Android 适配库,上层通过接口层隔离具体实现,保证了方案的通用性。

上述多个发明点的详细操作步骤为,如图1所示:

步骤101,Java端获取上下文对象;

步骤102,Java端将该上下文对象通过JNI传递到原生端;

JNI是Java Native Interface的缩写,中文为JAVA本地调用。 从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部 分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是 为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍 使用其他语言,只要调用约定受支持就可以了。

Java端只需要获取上下文对象并将上下文对象传递给原生端, 从而减少了对Java端的依赖性,代码模块化程度高。

步骤103,原生端获得该上下文对象后将该上下文对象进行保 存;

保存后备后调用。

步骤104,原生端通过保存的上下文对象,调用getResource方 法获得资源管理器;

getResource方法是本领域技术人员所公知的一个功能方法。

步骤105,原生端通过资源管理器的方法打开待读取资源;

打开和读取资源信息用到了Android的一些私有接口,为了保 证兼容性,本步骤采用了动态载入方式,流程图如图2所示:

步骤105-1,通过编译对应不同版本的Android的getResource 来完成对不同版本Android的适配;

上层应用调用的是接口层,底层改动不影响上层,而具体的实 现则针对Android版本不同略有差别,这个差别很小,通过上述动 态载入Android适配库,上层通过接口层隔离具体实现,保证了方 案的通用性。

不同的Android版本对应不同的getResource,各getResource 不同也仅是在参数上的不同。

步骤105-2,所述原生端通过Android的资源类ResTable的 getResource方法获得所述待读取资源的区块、所述数据;

步骤105-3,所述原生端通过所述区块,使用ResTable的 resolveReference方法获得所述待读取资源的真正区块位置;

步骤105-4,若所述真正区块位置有效,通过ResTable的 getTableCookie方法获得所述待读取资源的句柄;

步骤105-5,所述原生端通过ResTable的getTableStringBlock 方法,以所述区块为参数,获得所述待读取资源的真实路径。

对应动态载入方式的打开和读取资源信息的架构如图3,所示, 上层应用调用的是接口层,因为底层改动不影响上层,而具体的实 现则针对Android版本不同略有差别。

上述实现过程简单精悍,虽然需要针对不同平台进行适配,但 是,这只在第一步进行不同操作,而适配过程中,对应不同版本的 Android不同版本的getResource方法参数不同,进行对应性编译控 制,针对不同平台编译不同的库即可。

步骤106,原生端根据所述真实路径和所述句柄,通过Assert 的openNonAsset方法打开所述待读取资源的输入流。

步骤107,原生端通过该输入流读取待读取资源的数据。

分析上述整个方案,与传统方式相比:

1.Java端只需要传递给原生端上下文对象,对Java端依赖性小, 代码模块化程度高;

2.打开和读取资源简单直接,没有额外的开销,节省了内存和 事件,性能极高;

3.直接调用Android接口访问资源,因此,可获得资源的详细 信息,其他方案都无法得到。

需要说明的是,上述提到的各种方法(getResource方法、 ResTable的getResource方法、ResTable的resolveReference方法、 ResTable的getTableCookie方法、ResTable的getTableStringBlock 方法),以及API、以及Android均为本领域技术人员所了解,此处 不再赘述。

本发明的一些实施例中还提供了对应上述通过原生方式访问资 源的方法的Java端,包括第一获取组件、传递组件;

所述第一获取组件,用于获取上下文对象;

所述传递组件,用于将所述上下文对象通过JNI传递到原生端。

本发明的一个实施例中还提供了一种上述任一项所述的原生方 式访问资源的方法的原生端,

包括:第二获取组件、调用组件、打开组件、读取组件;

所述第二获取组件,用于获得所述上下文对象后将所述上下文 对象进行保存;

所述调用组件,用于通过所述上下文对象,调用getResource 方法获得资源管理器;

所述打开组件,用于通过资源管理器的方法打开待读取资源;

所述读取组件,用于获得输入流,通过所述输入流读取所述待 读取资源的数据。

所述打开组件优选包括:第三获取组件、第四获取组件、第五 获取组件、第六获取组件;

所述第三获取组件,用于通过Android的资源类ResTable的 getResource方法获得所述待读取资源的区块、所述数据;

所述第四获取组件,用于通过所述区块,使用ResTable的 resolveReference方法获得所述待读取资源的真正区块位置;

所述第五获取组件,用于若所述真正区块位置有效,通过 ResTable的getTableCookie方法获得所述待读取资源的句柄;

所述第六获取组件,用于通过ResTable的getTableStringBlock 方法,以所述区块为参数,获得所述待读取资源的真实路径。

所述读取组件,优选用于根据所述真实路径和所述句柄,通过 Assert的openNonAsset方法打开所述待读取资源的输入流。

本发明一个实施例中还提供了一种所述的方法的原生方式访问 资源的系统,

包括:上述的Java端、上述任一项所述的原生端。

本发明上述实施例的原生方式访问资源的方法、Java端、原生 端及系统,从原生端访问Android资源,只需Java传入上下文对象, 不依赖于APK具体位置,从原生端读取资源,保证读取的效率和灵 活性,减少Java端的依赖性,提高代码模块化程度,通过原生端访 问资源读取资源的方式简单,直接,没有额外的开销,节省了内存 和时间,性能高。

显然,本领域的技术人员应该明白,上述的本发明的各模块或 各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算 装置上,或者分布在多个计算装置所组成的网络上,可选地,它们 可以用计算装置可执行的程序代码来实现,从而,可以将它们存储 在存储装置中由计算装置来执行,或者将它们分别制作成各个集成 电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模 块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明, 对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在 本发明的精神和原则之内,所作的任何修改、等同替换、改进等, 均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号