公开/公告号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端的依赖性,提高代码模块化程度,通过原生端访 问资源读取资源的方式简单,直接,没有额外的开销,节省了内存 和时间,性能高。
显然,本领域的技术人员应该明白,上述的本发明的各模块或 各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算 装置上,或者分布在多个计算装置所组成的网络上,可选地,它们 可以用计算装置可执行的程序代码来实现,从而,可以将它们存储 在存储装置中由计算装置来执行,或者将它们分别制作成各个集成 电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模 块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明, 对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在 本发明的精神和原则之内,所作的任何修改、等同替换、改进等, 均应包含在本发明的保护范围之内。
机译: 提供对资源的连续访问的方法,用于在群集中提供客户端故障以使申请人能够在发生故障事件后重新获得对资源的访问的方法和系统。
机译: 通过扫描JAVA-APPLET编码条形码符号访问基于Internet的信息资源的系统和方法
机译: 通过扫描JAVA-APPLET编码条形码符号访问基于Internet的信息资源的系统和方法