一种通过方法调用实现与外围设备交互的方法和设备的制作方法

文档序号:6550912阅读:119来源:国知局
一种通过方法调用实现与外围设备交互的方法和设备的制作方法
【专利摘要】本发明公开一种通过Android系统中的方法调用实现与外围设备交互的方法和设备,该方法应用于包括终端设备和外围设备的系统中,该终端设备包括第一程序和第二程序,第一程序创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,并通过反射机制实现对第二程序中的方法的调用,进而实现与外围设备的交互,实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
【专利说明】一种通过方法调用实现与外围设备交互的方法和设备

【技术领域】
[0001] 本发明涉及计算机【技术领域】,特别是涉及一种通过方法调用实现与外围设备交互 的方法和设备。

【背景技术】
[0002] 随着计算机技术的发展,作为一种基于Linux的自由及开放源代码的操作系统, Android系统已广泛地应用于手机、平板电脑,以及其他终端设备中,基于Android系统的 应用程序的种类也日渐繁多,涵盖了办公、资讯、生活、购物、理财、阅读、娱乐和游戏等领 域,给用户提供了很大的便利。
[0003] 在实际使用中,用户通常需要在Android系统中同时运行多个应用程序,由于不 同的应用程序之间无法共享资源,因此容易造成对Android系统的内存资源的大量占用, 从而降低了应用程序运行的流畅度,损害了用户的使用体验,并对设备硬件提出了更高的 要求,降低了应用程序的设备兼容性。


【发明内容】

[0004] 本发明提供了一种通过Android系统中的方法调用实现与外围设备交互的方法 和设备,用以解决现有技术中对内存资源大量占用以及设备兼容性低的缺陷。
[0005] 本发明提供了一种通过Android系统中的方法调用实现与外围设备交互的方法, 应用于包括终端设备和外围设备的系统中,所述终端设备包括第一程序和第二程序,所述 方法包括以下步骤:
[0006] S1、所述第一程序根据所述第二程序的包名,创建所述第二程序的上下文;
[0007] S2、所述第一程序根据所述第二程序的上下文生成类加载器,并根据所述类加载 器、所述第二程序中的功能方法的包名和类名,将所述功能方法所属的类加载到所述第一 程序的进程中,得到与所述功能方法对应的类对象;
[0008] S3、所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法 对应的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限;
[0009] S4、所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述 功能方法对应的方法对象,将所述功能方法的名称发送给所述第二程序;
[0010] S5、所述第二程序通过调用所述功能方法,向所述外围设备发送相应的功能指 令;
[0011] S6、所述第二程序判断所述功能指令是否发送成功,如果是,则执行步骤S7 ;否 贝1J,执行步骤S9 ;
[0012] S7、所述第二程序向所述第一程序返回执行成功消息;
[0013] S8、所述第一程序显示交互成功信息,结束流程;
[0014] S9、所述第二程序向所述第一程序返回执行失败消息;
[0015] S10、所述第一程序显示交互失败信息,结束流程。
[0016] 本发明还提供了一种通过Android系统中的方法调用实现与外围设备交互的终 端设备,所述终端设备包括第一程序和第二程序,所述第一程序包括:
[0017] 第一创建模块,用于根据所述第二程序的包名,创建所述第二程序的上下文;
[0018] 生成模块,用于根据所述第一创建模块创建的所述第二程序的上下文生成类加载 器;
[0019] 加载模块,用于根据所述生成模块生成的所述类加载器、所述第二程序中的功能 方法的包名和类名,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述 功能方法对应的类对象;
[0020] 第一获取模块,用于根据所述加载模块得到的所述类对象和所述功能方法的名 称,获取与所述功能方法对应的方法对象;
[0021] 第一设置模块,用于根据所述第一获取模块获取到的所述方法对象设置所述功能 方法的访问控制权限;
[0022] 第二创建模块,用于根据所述加载模块得到的所述类对象创建对象实例;
[0023] 第一发送模块,用于根据所述第二创建模块创建的所述对象实例以及所述第一获 取模块获取到的与所述功能方法对应的方法对象,将所述功能方法的名称发送给所述第二 程序;
[0024] 第一接收模块,用于接收所述第二程序返回的执行成功消息或执行失败消息;
[0025] 显示模块,用于在所述第一接收模块接收到所述执行成功消息时,显示交互成功 信息;在所述第一接收模块接收到所述执行失败消息时,显示交互失败信息;
[0026] 所述第二程序包括:
[0027] 第二发送模块,用于通过调用所述功能方法,向所述外围设备发送相应的功能指 令;
[0028] 第一判断模块,用于判断所述第二发送模块是否发送所述功能指令成功;
[0029] 第三发送模块,用于在所述第一判断模块判断出所述功能指令发送成功时,向所 述第一程序返回执行成功消息;在所述第一判断模块判断出所述功能指令未发送成功时, 向所述第一程序返回执行失败消息。
[0030] 本发明达到的有益效果:第一程序创建第二程序的上下文,根据该上下文将第二 程序中的方法所属的类加载到自身的进程中,并通过反射机制实现对第二程序中的方法的 调用,进而实现与外围设备的交互,实现了程序之间的资源共享,减少了对内存资源的占 用,提高了程序的设备兼容性。

【专利附图】

【附图说明】
[0031] 图1为本发明实施例中的一种通过Android系统中的方法调用实现与外围设备交 互的方法流程图;
[0032] 图2至图6为本发明实施例中的另一种通过Android系统中的方法调用实现与外 围设备交互的方法流程图。
[0033] 图7为本发明实施例中的一种通过Android系统中的方法调用实现与外围设备交 互的终端设备的结构示意图。

【具体实施方式】
[0034] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本发明保护的范围。
[0035] 本发明实施例提供了一种通过Android系统中的方法调用实现与外围设备交互 的方法,该方法应用于包括第一程序、第二程序和外围设备的系统中,第一程序通过调用第 二程序中的功能方法,与外围设备交互,具体流程如图1所示,包括以下步骤:
[0036] 步骤101,第一程序根据第二程序的包名,创建第二程序的上下文。
[0037] 具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到第二程序的上下文。
[0038] 其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序 的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
[0039] 本实施例中,第一选项为 " C0NTEXT_INCLUDE_C0DE ",第二选项为 " C0NTEXT_ IGNORE_SECURITY"。
[0040] 例如,第二程序的包名为"PACKAGE_TEST_B"时,第一程序将"C0NTEXT_ INCLUDE_CODE|CONTEXT_IGNORE_SECURITY" 和"PACKAGE_TEST_B" 作为参数,调用 createPackageContext方法,得到第二程序的上下文Ctx。
[0041] 步骤102,第一程序根据第二程序的上下文生成类加载器,通过该类加载器将第二 程序中的功能方法所属的类加载到第一程序的进程中,得到与该功能方法对应的类对象。
[0042] 具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到 类加载器,并将第二程序中的功能方法的包名和类名作为参数,调用上述类加载器中的 loadClass方法,将第二程序中的功能方法所属的类加载到第一程序的进程中,得到与该功 能方法对应的类对象。
[0043] 例如,第二程序的上下文为Ctx,第二程序中的功能方法为handleHeadSet方法, 该handleHeadSet方法包含在名称为"TestApi"的类中,上述名称为"TestApi"的类包 含在名称为"com. icbc. audio, driver"的包中,则handleHeadSet方法的包名为"com. icbc. audio, driver",类名为 "TestApi",第一程序调用 Ctx 中的 getClassLoader 方法, 得到类加载器 classLoaderl,并将 "com. icbc. audio, driver. TestApi" 作为参数,调用 classLoaderl中的loadClass方法,将handleHeadSet方法所属的、名称为"TestApi"的类 加载到第一程序的进程中,并得到与handleHeadSet方法对应的类对象clsl。
[0044] 步骤103,第一程序根据与功能方法对应的类对象和该功能方法的名称,获取与该 功能方法对应的方法对象,并根据该方法对象设置功能方法的访问控制权限。
[0045] 具体地,当功能方法没有参数时,第一程序可以将功能方法的名称作为参数,调用 与功能方法对应的类对象中的getDeclaredMethod方法,获取与功能方法对应的方法对 象,并通过调用该方法对象中的setAccessible方法,设置功能方法的访问控制权限。
[0046] 当功能方法有参数时,第一程序可以根据功能方法的形参类型生成类数组,将功 能方法的名称和类数组作为参数,调用与功能方法对应的类对象中的getDeclaredMethod 方法,获取与功能方法对应的方法对象,并通过调用该方法对象中的setAccessible方法, 设置功能方法的访问控制权限。其中,上述类数组中的元素为与功能方法的形参类型对应 的类文件。
[0047] 例如,功能方法为handleHeadSet方法,handleHeadSet方法具有两个形参,其类 型分别为context类型和boolean类型,则类数组中的兀素为context, class和boolean, class,第一程序将 "handleHeadSet" 和{context, class,boolean, class}作为参数, 调用类对象clsl中的getDeclaredMethod方法,获取与handleHeadSet方法对应的方 法对象handMethodl,将布尔型常数"true"作为参数,调用方法对象handMethodl中的 setAccessible方法,将功能方法的访问控制权限设置为跳过访问检查。
[0048] 步骤104,第一程序根据与功能方法对应的类对象创建对象实例,根据该对象实例 以及与功能方法对应的方法对象,将功能方法的名称和实际参数发送给第二程序。
[0049] 具体地,第一程序可以通过调用与功能方法对应的类对象中的newlnstance方 法,创建对象实例,根据功能方法的实际参数生成对象数组,将上述对象实例和对象数组作 为参数,调用与功能方法对应的方法对象中的invoke方法,将功能方法的名称和实际参数 发送给第二程序。
[0050] 例如,功能方法为handleHeadSet方法,其实际参数包括第一程序的上下文ctx 和外围设备连接状态信息action,则第一程序调用类对象clsl中的newlnstance方法, 创建对象实例objl。第一程序生成的对象数组中的元素为ctx和action,第一程序将 objl和{ctx,action}作为参数,调用handMethodl中的invoke方法,将功能方法的名称 "handleHeadSet"、第一程序的上下文ctx和外围设备连接状态信息action发送给第二程 序。
[0051] 步骤105,第二程序根据功能方法的实际参数,通过调用该功能方法向外围设备发 送相应的功能指令。
[0052] 例如,第二程序根据第一程序的上下文ctx和外围设备连接状态信息action,通 过调用handleHeadSet方法向外围设备发送握手指令。
[0053] 步骤106,第二程序判断功能指令是否发送成功,如果是,则执行步骤107 ;否则, 执行步骤109。
[0054] 例如,第二程序判断握手指令是否发送成功。
[0055] 步骤107,第二程序向第一程序返回执行成功消息。
[0056] 例如,第二程序向第一程序返回执行成功消息"ok"。
[0057] 步骤108,第一程序显示交互成功信息,结束流程。
[0058] 例如,第一程序显示"与外围设备连接成功"。
[0059] 步骤109,第二程序向第一程序返回执行失败消息。
[0060] 例如,第一程序显示执行失败消息"error"。
[0061] 步骤110,第一程序显示交互失败信息,结束流程。
[0062] 例如,第一程序显示"与外围设备连接失败"。
[0063] 本发明实施例提供的技术方案中,第一程序根据第二程序的包名创建第二程序的 上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,并通过反射机 制实现对第二程序中的方法的调用,进而实现与外围设备的交互,实现了程序之间的资源 共享,减少了对内存资源的占用,提高了程序的设备兼容性。
[0064] 需要说明的是,在本发明的其他实施方式中,功能方法可以是无参数的方法,相应 地,第一程序根据类加载器创建对象实例后,根据该对象实例以及与功能方法对应的方法 对象,将功能方法的名称发送给第二程序;第二程序通过调用上述功能方法向外围设备发 送相应的功能指令,同样可以实现本发明的发明目的。
[0065]另外,在本发明的其他实施方式中,第二程序判断出功能指令发送成功后,获取外 围设备返回的响应码,根据该响应码判断是否执行成功,如果是,则向第一程序返回执行成 功消息;否则,向第一程序返回执行失败消息,同样可以实现本发明的发明目的。
[0066] 进一步地,本发明实施例中的一种通过Android系统中的方法调用实现与外围设 备交互的方法,可应用于包括终端设备和外围设备的系统中,该终端设备采用Android系 统,并安装有第一程序和第二程序,第二程序中的功能方法包括第一方法、第二方法、第三 方法和第四方法,第一程序可调用上述功能方法,分别实现与外围设备建立连接、对外围设 备中的卡片上电、向外围设备中的卡片发指令以及对外围设备中的卡片下电的功能,对应 的流程如图2至图6所示,包括以下步骤:
[0067] 步骤201,第一程序等待被触发。
[0068] 步骤202,第一程序对被触发的按键进行判断,如果是第一按键,则执行步骤203 ; 如果是第二按键,则执行步骤216 ;如果是第三按键,则执行步骤254 ;如果是第四按键,则 执行步骤272。
[0069] 本实施例中,第一按键为握手键,第二按键为上电键,第三按键为发指令键,第四 按键为下电键。
[0070] 步骤203,第一程序根据第二程序的包名,创建第二程序的上下文。
[0071] 具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到第二程序的上下文。
[0072] 其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序 的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
[0073] 本实施例中,第一选项为 " C0NTEXT_INCLUDE_C0DE ",第二选项为 " C0NTEXT_ IGNORE_SECURITY"。
[0074] 例如,第二程序的包名为"PACKAGE_TEST_B"时,第一程序将"C0NTEXT_ INCLUDE_CODE|CONTEXT_IGNORE_SECURITY" 和"PACKAGE_TEST_B" 作为参数,调用 createPackageContext方法,得到第二程序的上下文Ctx。
[0075] 步骤204,第一程序根据第二程序的上下文生成第一类加载器,通过第一类加载器 将第一方法所属的类加载到第一程序的进程中,得到第一类对象。
[0076] 具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第 一类加载器,并将第一方法的包名和类名作为参数,调用第一类加载器中的loadClass方 法,将第一方法所属的类加载到第一程序的进程中,得到第一类对象。
[0077] 例如,第二程序的上下文为Ctx,第一方法为handleHeadSet方法,该 handleHeadSet方法包含在名称为"TestApi"的类中,上述名称为"TestApi"的类包含在 名称为 "com. icbc. audio, driver" 的包中,则 handleHeadSet 方法的包名为 "com. icbc. audio, driver",类名为 "TestApi",第一程序调用 Ctx 中的 getClassLoader 方法,得到 第一类加载器 classLoaderl,并将 "com. icbc. audio, driver. TestApi " 作为参数,调用 classLoaderl中的loadClass方法,将handleHeadSet方法所属的、名称为"TestApi"的类 加载到第一程序的进程中,并得到第一类对象clsl。
[0078] 步骤205,第一程序根据第一类对象、第一方法的名称和形参类型,获取与第一方 法对应的第一方法对象。
[0079] 具体地,第一程序可以根据第一方法的形参类型生成第一类数组,将第一方法的 名称和第一类数组作为参数,调用第一类对象中的getDeclaredMethod方法,获取与第一 方法对应的第一方法对象。其中,上述第一类数组中的元素为与第一方法的形参类型对应 的类文件。
[0080] 例如,第一方法为handleHeadSet方法,handleHeadSet方法具有两个形参,其 类型分别为context类型和boolean类型,贝U第一类数组中的元素为context, class和 boolean, class,第一程序将"handleHeadSet"和{context, class,boolean, class}作为参 数,调用第一类对象clsl中的getDeclaredMethod方法,获取与handleHeadSet方法对应 的第一方法对象handMethodl。
[0081] 步骤206,第一程序根据第一方法对象,设置第一方法的访问控制权限。
[0082] 具体地,第一程序可以通过调用第一方法对象中的setAccessible方法,设置第 一方法的访问控制权限。
[0083] 本实施例中,第一程序可以将布尔型常数"true"作为参数,调用第一方法对象 handMethodl中的setAccessible方法,将第一方法的访问控制权限设置为跳过访问检查。
[0084] 步骤207,第一程序根据第一类对象创建第一对象实例。
[0085] 具体地,第一程序可以通过调用第一类对象中的newlnstance方法,仓ij建第一对 象实例。
[0086] 例如,第一程序调用第一类对象clsl中的newlnstance方法,仓ij建第一对象实例 objl。
[0087] 步骤208,第一程序根据第一对象实例和第一方法对象,将第一方法的名称、第一 程序的上下文和外围设备连接状态信息发送给第二程序。
[0088] 具体地,第一程序可以根据第一程序的上下文和外围设备连接状态信息生成第一 对象数组,将第一对象实例和第一对象数组作为参数,调用第一方法对象中的invoke方 法,将第一方法的名称、第一程序的上下文和外围设备连接状态信息发送给第二程序。
[0089] 例如,第一程序的上下文为ctx,外围设备连接状态信息为action,第一对象实例 为objl,第一方法对象为handMethodl,第一方法为handleHeadSet方法,则第一对象数组 中的元素为ctx和action,第一程序将objl和{ctx,action}作为参数,调用handMethodl 中的invoke方法,将第一方法的名称"handleHeadSet"、第一程序的上下文ctx和外围设备 连接状态信息action发送给第二程序。
[0090] 步骤209,第二程序将第一程序的上下文保存到本地,根据该上下文加载动态库, 对通讯库进行初始化。
[0091] 具体地,第二程序可以将第一程序的上下文作为参数,调用AudioToken类中的 getlnstance方法,从而加载动态库,对通讯库进行初始化。
[0092] 步骤210,第二程序判断第一程序的上下文是否为空,如果是,则执行步骤211 ;否 贝1J,执行步骤212。
[0093] 步骤211,第二程序向第一程序返回握手失败消息,第一程序显示握手失败信息, 并返回步骤201。
[0094] 例如,第二程序向第一程序返回握手失败消息"error",第一程序显示"与外围设 备连接失败"。
[0095] 步骤212,第二程序根据外围设备连接状态信息判断外围设备是否已与终端设备 连接上,如果是,则执行步骤213 ;否则,返回步骤211。
[0096] 例如,外围设备连接状态信息为action时,第二程序可以判断action的取值是否 为"true",如果是,则确定外围设备已与终端设备连接上;否则,确定外围设备没有与终端 设备连接上。
[0097] 步骤213,第二程序根据第一程序的上下文获取接口实例信息,向外围设备发送握 手指令。
[0098] 具体地,第二程序可以将第一程序的上下文作为参数,调用Apilmpl类中的 getlnstance方法,获取接口实例信息,并调用Apilmpl类中的handshake方法,向外围设备 发送握手指令。
[0099] 步骤214,第二程序判断握手指令是否发送成功,如果是,则执行步骤215 ;否则, 返回步骤211。
[0100] 具体地,第二程序可以判断handshake方法的返回值是否为第一预设值,如果是, 则确定握手指令发送成功;否则,确定握手指令发送未成功。其中,第一预设值可以为0。
[0101] 步骤215,第二程序向第一程序返回握手成功消息,第一程序显示握手成功信息, 并返回步骤201。
[0102] 例如,第二程序向第一程序返回握手成功消息"〇k",第一程序显示"与外围设备连 接成功"。
[0103] 步骤216,第一程序根据第二程序的包名,创建第二程序的上下文。
[0104] 具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到第二程序的上下文。
[0105] 其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序 的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
[0106] 本实施例中,第一选项为 " C0NTEXT_INCLUDE_C0DE ",第二选项为 " C0NTEXT_ IGN0RE_SECURITY"。
[0107] 例如,第二程序的包名为"PACKAGE_TEST_B"时,第一程序将"C0NTEXT_ INCLUDE_C0DE|C0NTEXT_IGN0RE_SECURITY" 和"PACKAGE_TEST_B" 作为参数,调用 createPackageContext方法,得到第二程序的上下文Ctx。
[0108] 步骤217,第一程序根据第二程序的上下文生成第二类加载器,通过第二类加载器 将第二方法所属的类加载到第一程序的进程中,得到第二类对象。
[0109] 具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第 二类加载器,并将第二方法的包名和类名作为参数,调用第二类加载器中的loadClass方 法,将第二方法所属的类加载到第一程序的进程中,得到第二类对象。
[0110] 例如,第二程序的上下文为Ctx,第二方法为cardPowerON方法,该cardPowerON 方法包含在名称为"TestApi"的类中,上述名称为"TestApi"的类包含在名称为"com. icbc. audio, driver" 的包中,则 cardPowerON 方法的包名为" com. icbc. audio, driver", 类名为"TestApi ",第一程序调用Ctx中的getClassLoader方法,得到第二类加载器 classLoader2,并将 "com. icbc. audio, driver. TestApi" 作为参数,调用 classLoader2 中 的loadClass方法,将cardPowerON方法所属的、名称为"TestApi"的类加载到第一程序的 进程中,并得到第二类对象cls2。
[0111] 步骤218,第一程序根据第二类对象、第二方法的名称和形参类型,获取与第二方 法对应的第二方法对象。
[0112] 具体地,第一程序可以根据第二方法的形参类型生成第二类数组,将第二方法的 名称和第二类数组作为参数,调用第二类对象中的getDeclaredMethod方法,获取与第二 方法对应的第二方法对象。其中,上述第二类数组中的元素为与第二方法的形参类型对应 的类文件。
[0113] 例如,第二方法为cardPowerON方法,cardPowerON方法具有一个形参,该形参 的类型为Byte类型,则第二类数组中的元素为Byte, class,第一程序将"cardPowerON" 和{Byte, class}作为参数,调用第二类对象cls2中的getDeclaredMethod方法,获取与 cardPowerON方法对应的第二方法对象handMethod2。
[0114] 步骤219,第一程序根据第二方法对象,设置第二方法的访问控制权限。
[0115] 具体地,第一程序可以通过调用第二方法对象中的setAccessible方法,设置第 二方法的访问控制权限。
[0116] 本实施例中,第一程序可以将布尔型常数"true"作为参数,调用第二方法对象 handMethod2中的setAccessible方法,将第二方法的访问控制权限设置为跳过访问检查。
[0117] 步骤220,第一程序根据第二类对象创建第二对象实例。
[0118] 具体地,第一程序可以通过调用第二类对象中的newlnstance方法,仓ij建第二对 象实例。
[0119] 例如,第一程序调用第二类对象cls2中的newlnstance方法,仓ij建第二对象实例 ob j2〇
[0120] 步骤221,第一程序根据第二对象实例和第二方法对象,将第二方法的名称和卡片 类型信息发送给第二程序。
[0121] 具体地,第一程序可以根据卡片类型信息生成第二对象数组,将第二对象实例和 第二对象数组作为参数,调用第二方法对象中的invoke方法,将第二方法的名称和卡片类 型信息发送给第二程序。
[0122] 例如,卡片类型信息为CardType,第二对象实例为obj2,第二方法对象为 handMethod2,第二方法为CardPowerON方法,贝U第二对象数组中的兀素为CardType,第一 程序将〇bj2和{CardType}作为参数,调用handMethod2中的invoke方法,将第二方法的 名称"CardPowerON"和卡片类型信息CardType发送给第二程序。
[0123] 步骤222,第二程序根据接收到的卡片类型信息,对外围设备中的卡片的类型进行 判断,如果是接触卡,则执行步骤223 ;如果是非接触卡,则执行步骤231 ;如果是未知,则执 行步骤239。
[0124] 具体地,第二程序可以对卡片类型信息的取值进行判断,如果是第二预设值,则确 定外围设备中的卡片的类型为接触卡;如果是第三预设值,则确定外围设备中的卡片的类 型为非接触卡;如果是其他数值,则确定外围设备中的卡片的类型为未知。
[0125] 例如,卡片类型信息为CardType,第二预设值为1,第三预设值为2,第二程序对 CardType的取值进行判断,如果是1,则确定外围设备中的卡片的类型为接触卡;如果是2, 则确定外围设备中的卡片的类型为非接触卡;如果是其他数值,则确定外围设备中的卡片 的类型为未知。
[0126] 步骤223,第二程序向外围设备发送第一寻卡指令。
[0127] 具体地,第二程序可以通过调用findCard_contact方法,向外围设备发送第一寻 卡指令。
[0128] 步骤224,第二程序判断第一寻卡指令是否发送成功,如果是,则执行步骤226 ;否 贝1J,执行步骤225。
[0129] 具体地,第二程序可以判断findCard_contact方法的返回值是否为第四预设值, 如果是,则确定第一寻卡指令发送成功;否则,确定第一寻卡指令发送未成功。其中,第四预 设值可以为〇。
[0130] 步骤225,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息, 并返回步骤201。
[0131] 例如,第二程序向第一程序返回"false",第一程序显示"上电失败"。
[0132] 步骤226,第二程序将外围设备中的卡片的类型设置为接触卡,生成上电指令,并 根据接口实例信息,将该上电指令发送给外围设备。
[0133] 具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指 令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
[0134] 步骤227,第二程序判断上电指令是否发送成功,如果是,则执行步骤228 ;否则, 返回步骤225。
[0135] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第五预设值,如果 是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第五预设值可以为 0〇
[0136] 步骤228,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0137] 步骤229,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功, 如果是,则执行步骤230 ;否则,返回步骤225。
[0138] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第六预设值,则 确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第六预 设值可以是"00"。
[0139] 步骤230,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息, 并返回步骤201。
[0140] 例如,第二程序向第一程序返回"true",第一程序显示"上电成功"。
[0141] 步骤231,第二程序向外围设备发送第二寻卡指令。
[0142] 具体地,第二程序可以通过调用findCard_nontact方法,向外围设备发送第二寻 卡指令。
[0143] 步骤232,第二程序判断第二寻卡指令是否发送成功,如果是,则执行步骤234 ;否 贝1J,执行步骤233。
[0144] 具体地,第二程序可以判断findCard_nontact方法的返回值是否为第七预设值, 如果是,则确定第二寻卡指令发送成功;否则,确定第二寻卡指令发送未成功。其中,第七预 设值可以为〇。
[0145] 步骤233,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息, 并返回步骤201。
[0146] 例如,第二程序向第一程序返回" false ",第一程序显示"上电失败"。
[0147] 步骤234,第二程序将外围设备中的卡片的类型设置为非接触卡,生成上电指令, 并根据接口实例信息将该上电指令发送给外围设备。
[0148] 具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指 令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
[0149] 步骤235,第二程序判断上电指令是否发送成功,如果是,则执行步骤236;否则, 返回步骤233。
[0150] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第八预设值,如果 是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第八预设值可以为 0〇
[0151] 步骤236,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0152] 步骤237,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功, 如果是,则执行步骤238 ;否则,返回步骤233。
[0153] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第九预设值,则 确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第九预 设值可以是"00"。
[0154] 步骤238,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息, 并返回步骤201。
[0155] 例如,第二程序向第一程序返回" true ",第一程序显示"上电成功"。
[0156] 步骤239,第二程序向外围设备发送第一寻卡指令。
[0157] 具体地,第二程序可以通过调用findCard_contact方法,向外围设备发送第一寻 卡指令。
[0158] 步骤240,第二程序判断第一寻卡指令是否发送成功,如果是,则执行步骤241 ;否 贝1J,执行步骤246。
[0159] 具体地,第二程序可以判断findCard_contact方法的返回值是否为第十预设值, 如果是,则确定第一寻卡指令发送成功;否则,确定第一寻卡指令发送未成功。其中,第十预 设值可以为〇。
[0160] 步骤241,第二程序将外围设备中的卡片的类型设置为接触卡,生成上电指令,并 根据接口实例信息将该上电指令发送给外围设备。
[0161] 具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指 令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
[0162] 步骤242,第二程序判断上电指令是否发送成功,如果是,则执行步骤243 ;否则, 执行步骤246。
[0163] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第^--预设值,如 果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十一预设值可以 为〇。
[0164] 步骤243,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0165] 步骤244,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功, 如果是,则执行步骤245 ;否则,执行步骤246。
[0166] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十二预设值, 则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第 十二预设值可以是"00"。
[0167] 步骤245,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息, 并返回步骤201。
[0168] 例如,第二程序向第一程序返回" true ",第一程序显示"上电成功"。
[0169] 步骤246,第二程序向外围设备发送第二寻卡指令。
[0170] 具体地,第二程序可以通过调用findCard_nontact方法,向外围设备发送第二寻 卡指令。
[0171] 步骤247,第二程序判断第二寻卡指令是否发送成功,如果是,则执行步骤249 ;否 贝1J,执行步骤248。
[0172] 具体地,第二程序可以判断findCard_nontact方法的返回值是否为第十三预设 值,如果是,则确定第二寻卡指令发送成功;否则,确定第二寻卡指令发送未成功。其中,第 十三预设值可以为〇。
[0173] 步骤248,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息, 并返回步骤201。
[0174] 例如,第二程序向第一程序返回"false",第一程序显示"上电失败"。
[0175] 步骤249,第二程序将外围设备中的卡片的类型设置为非接触卡,生成上电指令, 并根据接口实例信息将该上电指令发送给外围设备。
[0176] 具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指 令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
[0177] 步骤250,第二程序判断上电指令是否发送成功,如果是,则执行步骤251 ;否则, 返回步骤248。
[0178] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第十四预设值,如 果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十四预设值可以 为〇。
[0179] 步骤251,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0180] 步骤252,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功, 如果是,则执行步骤253 ;否则,返回步骤248。
[0181] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十五预设值, 则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第 十五预设值可以是"00"。
[0182] 步骤253,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息, 并返回步骤201。
[0183] 例如,第二程序向第一程序返回" true ",第一程序显示"上电成功"。
[0184] 步骤254,第一程序根据第二程序的包名,创建第二程序的上下文。
[0185] 具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到第二程序的上下文。
[0186] 其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序 的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
[0187] 本实施例中,第一选项为 " C0NTEXT_INCLUDE_C0DE ",第二选项为 " C0NTEXT_ IGNORE_SECURITY"。
[0188] 例如,第二程序的包名为"PACKAGE_TEST_B"时,第一程序将"C0NTEXT_ INCLUDE_CODE|CONTEXT_IGNORE_SECURITY" 和"PACKAGE_TEST_B" 作为参数,调用 createPackageContext方法,得到第二程序的上下文Ctx。
[0189] 步骤255,第一程序根据第二程序的上下文生成第三类加载器,通过第三类加载器 将第三方法所属的类加载到第一程序的进程中,得到第三类对象。
[0190] 具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第 三类加载器,并将第三方法的包名和类名作为参数,调用第三类加载器中的loadClass方 法,将第三方法所属的类加载到第一程序的进程中,得到第三类对象。
[0191] 例如,第二程序的上下文为Ctx,第三方法为CardtransCommand方法,该 CardtransCommand方法包含在名称为"TestApi"的类中,上述名称为"TestApi"的类包含 在名称为 "com. icbc. audio, driver" 的包中,则 CardtransCommand 方法的包名为 "com. icbc. audio, driver",类名为 "TestApi",第一程序调用 Ctx 中的 getClassLoader 方法,得 到第三类加载器classLoader3,并将"com. icbc. audio, driver. TestApi"作为参数,调用 classLoader3 中的 loadClass 方法,将 CardtransCommand 方法所属的、名称为 "TestApi" 的类加载到第一程序的进程中,并得到第三类对象cls3。
[0192] 步骤256,第一程序根据第三类对象、第三方法的名称和形参类型,获取与第三方 法对应的第三方法对象。
[0193] 具体地,第一程序可以根据第三方法的形参类型生成第三类数组,将第三方法的 名称和第三类数组作为参数,调用第三类对象中的getDeclaredMethod方法,获取与第三 方法对应的第三方法对象。其中,上述第三类数组中的元素为与第三方法的形参类型对应 的类文件。
[0194] 例如,第三方法为CardtransCommand方法,CardtransCommand方法具有三个形 参,其类型分别为byte □类型、int类型和byte □类型,则第三类数组中的元素为byte []. class、int. class 和 byte []· class,第一程序将 "CardtransCommand" 和{byte []· class, int. class, byte []· class}作为参数,调用第三类对象 cls3 中的 getDeclaredMethod 方法, 获取与CardtransCommand方法对应的第三方法对象handMethod3。
[0195] 步骤257,第一程序根据第三方法对象,设置第三方法的访问控制权限。
[0196] 具体地,第一程序可以通过调用第三方法对象中的setAccessible方法,设置第 三方法的访问控制权限。
[0197] 本实施例中,第一程序可以将布尔型常数"true"作为参数,调用第三方法对象 handMethod3中的setAccessible方法,将第三方法的访问控制权限设置为跳过访问检查。
[0198] 步骤258,第一程序根据第三类对象创建第三对象实例。
[0199] 具体地,第一程序可以通过调用第三类对象中的newlnstance方法,仓ij建第三对 象实例。
[0200] 例如,第一程序调用第三类对象cls3中的newlnstance方法,仓ij建第三对象实例 ob j3。
[0201] 步骤259,第一程序根据第三对象实例和第三方法对象,将第三方法的名称、指令 数据的存储区、指令数据的长度和接收数据的存储区发送给第二程序。
[0202] 具体地,第一程序可以根据指令数据的存储区、指令数据的长度和接收数据的存 储区生成第三对象数组,将第三对象实例和第三对象数组作为参数,调用第三方法对象中 的invoke方法,将第三方法的名称、指令数据的存储区、指令数据的长度和接收数据的存 储区发送给第二程序。
[0203] 例如,指令数据的存储区为cmd,指令数据的长度为cmdLen,接收数据的存储区为 res,第三对象实例为obj3,第三方法对象为handMethod3,第三方法为CardtransCommand 方法,则第三对象数组中的兀素为cmd、cmdLen和res,第一程序将ob j3和{cmd, cmdLen,res}作为参数,调用handMethod3中的invoke方法,将第三方法的名称 "CardtransCommand"、指令数据的存储区cmd、指令数据的长度cmdLen和接收数据的存储 区res发送给第二程序。
[0204] 步骤260,第二程序根据指令数据的存储区和指令数据的长度获取指令数据,并对 该指令数据进行格式转换,得到命令字符串。
[0205] 具体地,第二程序可以将指令数据作为参数,调用Convert类中的 Bytes2HeXString方法,将指令数据转换为命令字符串,其中,命令字符串可以为16进制的 字符串。
[0206] 步骤261,第二程序根据转换得到的命令字符串和外围设备中的卡片的类型组织 命令集,并根据接口实例信息向外围设备发送命令集。
[0207] 具体地,第二程序可以将命令字符串和外围设备中的卡片的类型作为参数,调用 PackData类中的packApduData方法,组织命令集,并将组织得到的命令集作为参数,调用 接口实例信息中的transmitApdu方法,向外围设备发送命令集。
[0208] 步骤262,第二程序判断命令集是否发送成功,如果是,则执行步骤264;否则,执 行步骤263。
[0209] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第十六预设值,如 果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十六预设值可以 为〇。
[0210] 步骤263,第二程序向第一程序发送错误码,第一程序显示发指令失败信息,并返 回步骤201。
[0211] 例如,第二程序向第一程序返回"error",第一程序显示"指令发送失败"。
[0212] 步骤264,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0213] 步骤265,第二程序根据获取到的响应码,判断是否向外围设备中的卡片发送指令 成功,如果是,则执行步骤266 ;否则,返回步骤263。
[0214] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十七预设值, 则确定向外围设备中的卡片发送指令成功;否则,确定向外围设备中的卡片发送指令未成 功。其中,第十七预设值可以是"〇〇"。
[0215] 步骤266,第二程序判断卡片返回给外围设备的指令响应的长度是否大于第一预 设长度,如果是,则执行步骤267 ;否则,执行步骤268。
[0216] 例如,第一预设长度为8字节。
[0217] 步骤267,第二程序将位于指令响应末尾、长度为第二预设长度的数据丢弃。
[0218] 例如,第二预设长度为4字节。
[0219] 需要说明的是,执行完本步骤后,继续执行步骤268。
[0220] 步骤268,第二程序对指令响应进行格式转换,将转换得到的响应数据存储到接收 数据的存储区中,并将响应数据的长度返回给第一程序。
[0221] 具体地,第二程序可以将指令响应作为参数,调用Convert类中的hexToBytes方 法,将指令响应转换为响应数据存储到接收数据的存储区中,并将响应数据的长度返回给 第一程序。
[0222] 步骤269,第一程序判断响应数据的长度是否大于零,如果是,则执行步骤271 ;否 贝1J,执行步骤270。
[0223] 步骤270,第一程序显示发指令失败信息,并返回步骤201。
[0224] 例如,第一程序显示"指令发送失败"。
[0225] 步骤271,第一程序根据响应数据的长度,从接收数据的存储区中读取响应数据, 并返回步骤201。
[0226] 步骤272,第一程序根据第二程序的包名,创建第二程序的上下文。
[0227] 具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到第二程序的上下文。
[0228] 其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序 的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
[0229] 本实施例中,第一选项为 " C0NTEXT_INCLUDE_C0DE ",第二选项为 " C0NTEXT_ IGNORE_SECURITY"。
[0230] 例如,第二程序的包名为"PACKAGE_TEST_B"时,第一程序将"C0NTEXT_ INCLUDE_CODE|CONTEXT_IGNORE_SECURITY" 和"PACKAGE_TEST_B" 作为参数,调用 createPackageContext方法,得到第二程序的上下文Ctx。
[0231] 步骤273,第一程序根据第二程序的上下文生成第四类加载器,通过第四类加载器 将第四方法所属的类加载到第一程序的进程中,得到第四类对象。
[0232] 具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第 四类加载器,并将第四方法的包名和类名作为参数,调用第四类加载器中的loadClass方 法,将第四方法所属的类加载到第一程序的进程中,得到第四类对象。
[0233] 例如,第二程序的上下文为Ctx,第四方法为cardPowerDown方法,该 cardPowerDown方法包含在名称为"TestApi"的类中,上述名称为"TestApi"的类包含在 名称为 "com. icbc. audio, driver" 的包中,则 cardPowerDown 方法的包名为 "com. icbc. audio, driver",类名为 "TestApi",第一程序调用 Ctx 中的 getClassLoader 方法,得到 第四类加载器 classLoader4,并将 "com. icbc. audio, driver. TestApi" 作为参数,调用 classLoader4中的loadClass方法,将cardPowerDown方法所属的、名称为"TestApi"的类 加载到第一程序的进程中,并得到第四类对象cls4。
[0234] 步骤274,第一程序根据第四类对象和第四方法的名称,获取与第四方法对应的第 四方法对象。
[0235] 具体地,第一程序可以根据第四方法的形参类型生成第四类数组,将第四方法的 名称和第四类数组作为参数,调用第四类对象中的getDeclaredMethod方法,获取与第四 方法对应的第四方法对象。其中,第四方法没有参数,上述第四类数组中的元素为空。
[0236] 例如,第四方法为cardPowerDown方法,第四类数组中的元素为空,第一程序将 "cardPowerDown"和{}作为参数,调用第四类对象cls4中的getDeclaredMethod方法,获 取与cardPowerDown方法对应的第四方法对象handMethod4。
[0237] 步骤275,第一程序根据第四方法对象,设置第四方法的访问控制权限。
[0238] 具体地,第一程序可以通过调用第四方法对象中的setAccessible方法,设置第 四方法的访问控制权限。
[0239] 本实施例中,第一程序可以将布尔型常数"true"作为参数,调用第四方法对象 handMethod4中的setAccessible方法,将第四方法的访问控制权限设置为跳过访问检查。
[0240] 步骤276,第一程序根据第四类对象创建第四对象实例。
[0241] 具体地,第一程序可以通过调用第四类对象中的newlnstance方法,仓ij建第四对 象实例。
[0242] 例如,第一程序调用第四类对象cls4中的newlnstance方法,仓ij建第四对象实例 ob j4〇
[0243] 步骤277,第一程序根据第四对象实例和第四方法对象,将第四方法的名称发送给 第二程序。
[0244] 具体地,第一程序可以生成第四对象数组,将第四对象实例和第四对象数组作为 参数,调用第四方法对象中的invoke方法,将第四方法的名称发送给第二程序。其中,第四 对象数组中的元素为空。
[0245] 例如,第四对象实例为obj4,第四方法对象为handMethod4,第四方法为 cardPowerDown方法,第四对象数组中的元素为空,第一程序将obj4和{}作为参数,调用 handMethod4中的invoke方法,将第四方法的名称"cardPowerDown"发送给第二程序。
[0246] 步骤278,第二程序根据外围设备中的卡片的类型生成下电指令,并根据接口实例 信息向外围设备发送该下电指令。
[0247] 具体地,第二程序根据外围设备中的卡片的类型,调用PackData类中的 packPowerOffData方法,生成下电指令,并将下电指令作为参数,调用接口实例信息中的 transmitApdu方法,将下电指令发送给外围设备。
[0248] 步骤279,第二程序判断下电指令是否发送成功,如果是,则执行步骤281 ;否则, 执行步骤280。
[0249] 具体地,第二程序可以判断transmitApdu方法的返回值是否为第十八预设值,如 果是,则确定下电指令发送成功;否则,确定下电指令发送未成功。其中,第十八预设值可以 为〇。
[0250] 步骤280,第二程序向第一程序发送下电失败消息,第一程序显示下电失败信息, 并返回步骤201。
[0251] 例如,第二程序向第一程序返回"false",第一程序显示"下电失败"。
[0252] 步骤281,第二程序获取外围设备中的卡片返回给外围设备的响应码。
[0253] 步骤282,第二程序根据获取到的响应码,判断外围设备中的卡片是否下电成功, 如果是,则执行步骤283 ;否则,返回步骤280。
[0254] 具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十九预设值, 则确定外围设备中的卡片下电成功;否则,确定外围设备中的卡片下电未成功。其中,第 十九预设值可以是"〇〇"。
[0255] 步骤283,第二程序向第一程序发送下电成功消息,第一程序显示下电成功信息, 并返回步骤201。
[0256] 例如,第二程序向第一程序返回"true",第一程序显示"下电成功"。
[0257] 本发明实施例提供的技术方案中,终端设备中的第一程序根据终端设备中的第二 程序的包名创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自 身的进程中,通过反射机制实现对第二程序中的第一方法、第二方法、第三方法和第四方法 的调用,实现了与外围设备建立连接、对外围设备中的卡片上电、向外围设备中的卡片发指 令,以及对外围设备中的卡片下电的功能,进而实现了程序之间的资源共享,减少了对内存 资源的占用,提高了程序的设备兼容性。
[0258] 基于上述通过方法调用实现与外围设备交互的方法,本发明实施例还提供了一种 通过Android系统中的方法调用实现与外围设备交互的终端设备,如图7所示,该终端设备 采用Android系统,并安装有第一程序700和第二程序800 ;
[0259] 其中,第一程序700包括:
[0260] 第一创建模块701,用于根据第二程序800的包名,创建第二程序800的上下文;
[0261] 具体地,上述第一创建模块701,具体用于将第二程序800的包名和预设标记值作 为参数,调用createPackageContext方法,得到第二程序800的上下文;
[0262] 生成模块702,用于根据第一创建模块701创建的第二程序800的上下文生成类加 载器;
[0263] 具体地,上述生成模块702,具体用于调用第二程序800的上下文中的 getClassLoader方法,得到类加载器;
[0264] 加载模块703,用于根据生成模块702生成的类加载器、第二程序800中的功能方 法的包名和类名,将功能方法所属的类加载到第一程序700的进程中,得到与功能方法对 应的类对象;
[0265] 具体地,上述加载模块703,具体用于将第二程序800中的功能方法的包名和类名 作为参数,调用类加载器中的loadClass方法,将功能方法所属的类加载到第一程序700的 进程中,得到与功能方法对应的类对象;
[0266] 第一获取模块704,用于根据加载模块703得到的类对象和功能方法的名称,获取 与功能方法对应的方法对象;
[0267] 具体地,上述第一获取模块704,具体用于将功能方法的名称作为参数,调用类对 象中的getDeclaredMethod方法,获取与功能方法对应的方法对象;
[0268] 第一设置模块705,用于根据第一获取模块704获取到的方法对象设置功能方法 的访问控制权限;
[0269] 具体地,上述第一设置模块705,具体用于通过调用方法对象中的setAccessible 方法,设置功能方法的访问控制权限;
[0270] 第二创建模块706,用于根据加载模块703得到的类对象创建对象实例;
[0271] 具体地,上述第二创建模块706,具体用于通过调用类对象中的newlnstance方 法,创建对象实例;
[0272] 第一发送模块707,用于根据第二创建模块706创建的对象实例以及第一获取模 块704获取到的与功能方法对应的方法对象,将功能方法的名称发送给第二程序800 ;
[0273] 具体地,上述第一发送模块707,具体用于将对象实例作为参数,调用与功能方法 对应的方法对象中的invoke方法,将功能方法的名称和实际参数发送给第二程序800 ;
[0274] 第一接收模块708,用于接收第二程序800返回的执行成功消息或执行失败消息;
[0275] 显示模块709,用于在第一接收模块708接收到执行成功消息时,显示交互成功信 息;在第一接收模块708接收到执行失败消息时,显示交互失败信息;
[0276] 第二程序800包括:
[0277] 第二发送模块801,用于通过调用功能方法,向外围设备发送相应的功能指令;
[0278] 第一判断模块802,用于判断第二发送模块801是否发送功能指令成功;
[0279] 第三发送模块803,用于在第一判断模块802判断出功能指令发送成功时,向第一 程序700返回执行成功消息;在第一判断模块802判断出功能指令未发送成功时,向第一程 序700返回执行失败消息。
[0280] 本实施例中,上述第一获取模块704,具体用于根据加载模块703得到的类对象、 功能方法的名称和形参类型,获取与功能方法对应的方法对象;
[0281] 具体地,上述第一获取模块704,具体用于根据功能方法的形参类型生成类数组, 将功能方法的名称和类数组作为参数,调用类对象中的getDeclaredMethod方法,获取与 功能方法对应的方法对象;
[0282] 相应地,上述第一发送模块707,具体用于根据第二创建模块706创建的对象实例 以及第一获取模块704获取到的与功能方法对应的方法对象,将功能方法的名称和实际参 数发送给第二程序800 ;
[0283] 具体地,上述第一发送模块707,具体用于根据功能方法的实际参数生成对象数 组,将对象实例和对象数组作为参数,调用与功能方法对应的方法对象中的invoke方法, 将功能方法的名称和实际参数发送给第二程序800。
[0284] 上述第二发送模块801,具体用于根据功能方法的实际参数,通过调用功能方法, 向外围设备发送相应的功能指令。
[0285] 其中,上述功能方法可以为第一方法,相应地,类加载器为第一类加载器,类对象 为第一类对象,第一方法的实际参数为第一程序700的上下文和外围设备连接状态信息, 功能指令为握手指令,执彳了成功消息为握手成功消息,受互成功?目息为握手成功?目息,执灯 失败消息为握手失败消息,交互失败信息为握手失败信息;
[0286] 相应地,上述第一获取模块704,具体用于根据第一类对象、第一方法的名称和形 参类型,获取与第一方法对应的第一方法对象;
[0287] 上述第二创建模块706,具体用于根据第一类对象创建第一对象实例;
[0288] 上述第一发送模块707,具体用于根据第一对象实例和第一方法对象,将第一方法 的名称、第一程序700的上下文和外围设备连接状态信息发送给第二程序800 ;
[0289] 上述第二发送模块801,具体用于根据第一程序700的上下文和外围设备连接状 态信息,通过调用第一方法,向外围设备发送握手指令。
[0290] 上述第二程序800,还包括:
[0291] 第二接收模块804,用于接收第一程序700的上下文和外围设备连接状态信息;
[0292] 初始化模块805,用于将第二接收模块804接收到的第一程序700的上下文保存到 本地,根据第一程序700的上下文加载动态库,对通讯库进行初始化;
[0293] 第二判断模块806,用于判断第二接收模块804接收到的第一程序700的上下文是 否为空;
[0294] 第三判断模块807,用于在第二判断模块806判断出第一程序700的上下文不为空 时,根据第二接收模块804接收到的外围设备连接状态信息判断外围设备是否已与终端设 备连接上;
[0295] 第二获取模块808,用于在第三判断模块807判断出外围设备已与终端设备连接 上时,根据第一程序700的上下文获取接口实例信息;
[0296] 第三发送模块803,还用于在第二判断模块806判断出第一程序700的上下文为 空,或者第三判断模块807判断外围设备未与终端设备连接上时,向第一程序700返回握手 失败消息。
[0297] 进一步地,上述第二程序800,还包括:
[0298] 第四判断模块809,用于获取外围设备返回的响应码,根据响应码判断是否执行成 功;
[0299] 第三发送模块803,还用于在第四判断模块809判断出执行成功时,向第一程序 700返回执行成功消息;在第四判断模块809判断出未执行成功时,向第一程序700返回执 行失败消息。
[0300] 其中,上述功能方法还可以为第二方法,相应地,上述类加载器为第二类加载器, 类对象为第二类对象,第二方法的实际参数为卡片类型信息,功能指令为上电指令,执行成 功消息为上电成功消息,交互成功信息为上电成功信息,执行失败消息为上电失败消息,交 互失败信息为上电失败信息;
[0301] 上述第一获取模块704,具体用于根据第二类对象、第二方法的名称和形参类型, 获取与第二方法对应的第二方法对象;
[0302] 上述第二创建模块706,具体用于根据第二类对象创建第二对象实例;
[0303] 上述第一发送模块707,具体用于根据第二对象实例和第二方法对象,将第二方法 的名称和卡片类型信息发送给第二程序800 ;
[0304] 上述第二发送模块801,具体用于根据卡片类型信息,通过调用第二方法,向外围 设备发送上电指令;
[0305] 上述第四判断模块809,具体用于获取外围设备中的卡片返回给外围设备的响应 码,根据响应码判断外围设备中的卡片是否上电成功;
[0306] 上述第三发送模块803,具体用于在第四判断模块809判断出上电成功时,向第一 程序700返回上电成功消息;在第四判断模块809判断出未上电成功时,向第一程序700返 回上电失败消息。
[0307] 进一步地,上述第二程序800,还包括:
[0308] 第二接收模块804,用于接收来自第一程序700的卡片类型信息;
[0309] 第五判断模块810,用于根据第二接收模块804接收到的卡片类型信息,对外围设 备中的卡片的类型进行判断;
[0310] 上述第二发送模块801,还用于在第五判断模块810判断出卡片的类型为接触卡 时,向外围设备发送第一寻卡指令;在第五判断模块810判断出卡片的类型为非接触卡时, 向外围设备发送第二寻卡指令;
[0311] 上述第一判断模块802,还用于判断第二发送模块801是否发送第一寻卡指令和 第二寻卡指令成功;
[0312] 上述第三发送模块803,还用于在第一判断模块802判断出第一寻卡指令或第二 寻卡指令发送失败时,向第一程序700发送上电失败消息;
[0313] 上述第二程序800,还包括:
[0314] 第二设置模块811,用于在第一判断模块802判断出第一寻卡指令发送成功时,将 外围设备中的卡片的类型设置为接触卡,生成上电指令,并触发第二发送模块801发送上 电指令;在第一判断模块802判断出第二寻卡指令发送成功时,将外围设备中的卡片的类 型设置为非接触卡,生成上电指令,并触发第二发送模块801发送上电指令。
[0315] 进一步地,上述第二发送模块801,还用于在第五判断模块810判断出卡片的类型 为未知时,向外围设备发送第一寻卡指令;在第一判断模块802判断出第一寻卡指令发送 失败时,向外围设备发送第二寻卡指令。
[0316] 其中,上述功能方法还可以为第三方法,相应地,类加载器为第三类加载器,类对 象为第三类对象,第三方法的实际参数为指令数据的存储区、指令数据的长度和接收数据 的存储区,功能指令为命令集,执行成功消息为响应数据的长度,交互成功信息为发指令成 功信息,执行失败消息为错误码,交互失败信息为发指令失败信息;
[0317] 相应地,第一获取模块704,具体用于根据第三类对象、第三方法的名称和形参类 型,获取与第三方法对应的第三方法对象;
[0318] 上述第二创建模块706,具体用于根据第三类对象创建第三对象实例;
[0319] 上述第一发送模块707,具体用于根据第三对象实例和第三方法对象,将第三方法 的名称、指令数据的存储区、指令数据的长度和接收数据的存储区发送给第二程序800 ;
[0320] 上述第二发送模块801,具体用于根据指令数据的存储区、指令数据的长度和接收 数据的存储区,通过调用第三方法,向外围设备发送命令集;
[0321] 上述第四判断模块809,具体用于获取外围设备中的卡片返回给外围设备的响应 码,根据响应码判断是否向外围设备中的卡片发送指令成功;
[0322] 上述第三发送模块803,具体用于在第四判断模块809判断出发送指令成功时,向 第一程序700返回执行成功消息;在第四判断模块809判断出发送指令失败时,向第一程序 700返回执行失败消息。
[0323] 进一步地,上述第二程序800,还包括:
[0324] 第二接收模块804,用于接收指令数据的存储区、指令数据的长度和接收数据的存 储区;
[0325] 转换模块812,用于根据第二接收模块804接收到的指令数据的存储区和指令数 据的长度获取指令数据,并对指令数据进行格式转换,得到命令字符串;
[0326] 组织模块813,用于根据转换模块812转换得到的命令字符串和外围设备中的卡 片的类型组织命令集;
[0327] 第二发送模块801,具体用于通过调用第三方法,向外围设备发送组织模块813组 织的命令集。
[0328] 进一步地,上述第二程序800,还包括:
[0329] 第六判断模块814,用于在第四判断模块809判断出向外围设备中的卡片发送指 令成功后,判断外围设备中的卡片返回给外围设备的指令响应的长度是否大于第一预设长 度;
[0330] 处理模块815,用于在第六判断模块814判断出指令响应的长度大于第一预设长 度时,将位于指令响应末尾、长度为第二预设长度的数据丢弃,并对指令响应进行格式转 换,将转换得到的响应数据存储到接收数据的存储区中,并将响应数据的长度返回给第一 程序700 ;在第六判断模块814判断出指令响应的长度不大于第一预设长度时,对指令响应 进行格式转换,将转换得到的响应数据存储到接收数据的存储区中,并将响应数据的长度 返回给第一程序700;
[0331] 相应地,上述第一接收模块708,还用于接收响应数据的长度;
[0332] 上述第一程序700,还包括:
[0333] 第七判断模块710,用于判断第一接收模块708接收到的响应数据的长度是否大 于零;
[0334] 读取模块711,用于在第七判断模块710判断出响应数据的长度大于零时,根据响 应数据的长度,从接收数据的存储区中读取响应数据;
[0335] 显示模块709,还用于在第七判断模块710判断出响应数据的长度不大于零时,显 示发指令失败信息。
[0336] 进一步地,上述第二程序800,还包括:
[0337] 第四判断模块809,用于获取外围设备返回的响应码,根据响应码判断是否执行成 功;
[0338] 上述第三发送模块803,还用于在第四判断模块809判断出执行成功时,向第一程 序700返回执行成功消息;在第四判断模块809判断出未执行成功时,向第一程序700返回 执行失败消息。
[0339] 其中,上述功能方法还可以为第四方法,相应地,类加载器为第四类加载器,类对 象为第四类对象,功能指令为下电指令,执行成功消息为下电成功消息,交互成功信息为下 电成功信息,执行失败消息为下电失败消息,交互失败信息为下电失败信息;
[0340] 相应地,上述第一获取模块704,具体用于根据第四类对象和第四方法的名称,获 取与第四方法对应的第四方法对象;
[0341] 上述第二创建模块706,具体用于根据第四类对象创建第四对象实例;
[0342] 上述第一发送模块707,具体用于根据第四对象实例和第四方法对象,将第四方法 的名称发送给第二程序800;
[0343] 上述第二发送模块801,具体用于通过调用第四方法,向外围设备发送下电指令;
[0344] 上述第四判断模块809,具体用于获取外围设备返回的响应码,根据响应码判断外 围设备中的卡片是否下电成功。
[0345] 本发明实施例提供的技术方案中,终端设备中的第一程序根据终端设备中的第二 程序的包名创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自 身的进程中,通过反射机制实现对第二程序中的第一方法、第二方法、第三方法和第四方法 的调用,实现了与外围设备建立连接、对外围设备中的卡片上电、向外围设备中的卡片发指 令,以及对外围设备中的卡片下电的功能,进而实现了程序之间的资源共享,减少了对内存 资源的占用,提高了程序的设备兼容性。
[0346] 结合本文中所公开的实施例描述的方法中的步骤可以直接用硬件、处理器执行的 软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器 (ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或【技术领域】 内所公知的任意其它形式的存储介质中。
[0347] 以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何 熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵 盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
【权利要求】
1. 一种通过Android系统中的方法调用实现与外围设备交互的方法,其特征在于,应 用于包括终端设备和外围设备的系统中,所述终端设备包括第一程序和第二程序,所述方 法包括以下步骤: 51、 所述第一程序根据所述第二程序的包名,创建所述第二程序的上下文; 52、 所述第一程序根据所述第二程序的上下文生成类加载器,并根据所述类加载器、所 述第二程序中的功能方法的包名和类名,将所述功能方法所属的类加载到所述第一程序的 进程中,得到与所述功能方法对应的类对象; 53、 所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法对应 的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限; 54、 所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述功能 方法对应的方法对象,将所述功能方法的名称发送给所述第二程序; 55、 所述第二程序通过调用所述功能方法,向所述外围设备发送相应的功能指令; 56、 所述第二程序判断所述功能指令是否发送成功,如果是,则执行步骤S7 ;否则,执 行步骤S9 ; 57、 所述第二程序向所述第一程序返回执行成功消息; 58、 所述第一程序显示交互成功信息,结束流程; 59、 所述第二程序向所述第一程序返回执行失败消息; S10、所述第一程序显示交互失败信息,结束流程。
2. 如权利要求1所述的方法,其特征在于,所述步骤S3,具体为: 所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方 法对应的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限; 所述步骤S4,具体为: 所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述功能方法 对应的方法对象,将所述功能方法的名称和实际参数发送给所述第二程序; 所述步骤S5,具体为: 所述第二程序根据所述功能方法的实际参数,通过调用所述功能方法,向所述外围设 备发送相应的功能指令。
3. 如权利要求2所述的方法,其特征在于,所述功能方法为第一方法,所述类加载器为 第一类加载器,所述类对象为第一类对象,所述第一方法的实际参数为所述第一程序的上 下文和外围设备连接状态信息,所述功能指令为握手指令,所述执行成功消息为握手成功 消息,所述交互成功信息为握手成功信息,所述执行失败消息为握手失败消息,所述交互失 败信息为握手失败信息; 所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方 法对应的方法对象,具体为: 所述第一程序根据所述第一类对象、所述第一方法的名称和形参类型,获取与所述第 一方法对应的第一方法对象; 所述步骤S4,具体为: 所述第一程序根据所述第一类对象创建第一对象实例,根据所述第一对象实例和所述 第一方法对象,将所述第一方法的名称、所述第一程序的上下文和所述外围设备连接状态 信息发送给所述第二程序; 所述步骤S5,具体为: 所述第二程序根据所述第一程序的上下文和所述外围设备连接状态信息,通过调用所 述第一方法,向所述外围设备发送所述握手指令。
4. 如权利要求3所述的方法,其特征在于,所述步骤S5之前,还包括: 511、 所述第二程序将所述第一程序的上下文保存到本地,根据所述第一程序的上下文 加载动态库,对通讯库进行初始化; 512、 所述第二程序判断所述第一程序的上下文是否为空,如果是,则执行步骤S13 ;否 贝1J,执行步骤S14; 513、 所述第二程序向所述第一程序返回所述握手失败消息,所述第一程序显示所述握 手失败息; 514、 所述第二程序根据所述外围设备连接状态信息判断所述外围设备是否已与所述 终端设备连接上,如果是,则执行步骤S15 ;否则,返回步骤S13 ; 515、 所述第二程序根据所述第一程序的上下文获取接口实例信息,并执行步骤S5。
5. 如权利要求2所述的方法,其特征在于,所述步骤S7之前,还包括: 516、 所述第二程序获取所述外围设备返回的响应码,根据所述响应码判断是否执行成 功,如果是,则执行步骤S7 ;否则,执行步骤S9。
6. 如权利要求5所述的方法,其特征在于,所述功能方法为第二方法,所述类加载器为 第二类加载器,所述类对象为第二类对象,所述第二方法的实际参数为卡片类型信息,所述 功能指令为上电指令,所述执行成功消息为上电成功消息,所述交互成功信息为上电成功 信息,所述执行失败消息为上电失败消息,所述交互失败信息为上电失败信息; 所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方 法对应的方法对象,具体为: 所述第一程序根据所述第二类对象、所述第二方法的名称和形参类型,获取与所述第 二方法对应的第二方法对象; 所述步骤S4,具体为: 所述第一程序根据所述第二类对象创建第二对象实例,根据所述第二对象实例和所述 第二方法对象,将所述第二方法的名称和所述卡片类型信息发送给所述第二程序; 所述步骤S5,具体为: 所述第二程序根据所述卡片类型信息,通过调用所述第二方法,向所述外围设备发送 所述上电指令; 所述步骤S16,具体为: 所述第二程序获取所述外围设备中的卡片返回给所述外围设备的响应码,根据所述 响应码判断所述外围设备中的卡片是否上电成功,如果是,则执行步骤S7 ;否则,执行步骤 S9〇
7. 如权利要求6所述的方法,其特征在于,所述步骤S5之前,还包括: 517、 所述第二程序根据所述卡片类型信息,对所述外围设备中的卡片的类型进行判 断,如果是接触卡,则执行步骤S18 ;如果是非接触卡,则执行步骤S22 ; 518、 所述第二程序向所述外围设备发送第一寻卡指令; 519、 所述第二程序判断所述第一寻卡指令是否发送成功,如果是,则执行步骤S21 ;否 贝1J,执行步骤S20 ; 520、 所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上 电失败息; 521、 所述第二程序将所述外围设备中的卡片的类型设置为接触卡,生成所述上电指 令,并执行步骤S5; 522、 所述第二程序向所述外围设备发送第二寻卡指令; 523、 所述第二程序判断所述第二寻卡指令是否发送成功,如果是,则执行步骤S25 ;否 贝1J,执行步骤S24 ; 524、 所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上 电失败息; 525、 所述第二程序将所述外围设备中的卡片的类型设置为非接触卡,生成所述上电指 令,并执行步骤S5。
8. 如权利要求7所述的方法,其特征在于,所述第二程序根据所述卡片类型信息,判断 出所述外围设备中的卡片的类型为未知之后,还包括以下步骤: 526、 所述第二程序向所述外围设备发送第一寻卡指令; 527、 所述第二程序判断所述第一寻卡指令是否发送成功,如果是,则执行步骤S28 ;否 贝1J,执行步骤S29 ; 528、 所述第二程序将所述外围设备中的卡片的类型设置为接触卡,生成所述上电指 令,并执行步骤S5; 529、 所述第二程序向所述外围设备发送第二寻卡指令; 530、 所述第二程序判断所述第二寻卡指令是否发送成功,如果是,则执行步骤S32 ;否 贝1J,执行步骤S31 ; 531、 所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上 电失败息; 532、 所述第二程序将所述外围设备中的卡片的类型设置为非接触卡,生成所述上电指 令,并执行步骤S5。
9. 如权利要求5所述的方法,其特征在于,所述功能方法为第三方法,所述类加载器为 第三类加载器,所述类对象为第三类对象,所述第三方法的实际参数为指令数据的存储区、 指令数据的长度和接收数据的存储区,所述功能指令为命令集,所述执行成功消息为响应 数据的长度,所述交互成功信息为发指令成功信息,所述执行失败消息为错误码,所述交互 失败信息为发指令失败信息; 所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方 法对应的方法对象,具体为: 所述第一程序根据所述第三类对象、所述第三方法的名称和形参类型,获取与所述第 三方法对应的第三方法对象; 所述步骤S4,具体为: 所述第一程序根据所述第三类对象创建第三对象实例,根据所述第三对象实例和所述 第三方法对象,将所述第三方法的名称、所述指令数据的存储区、所述指令数据的长度和所 述接收数据的存储区发送给所述第二程序; 所述步骤S5,具体为: 所述第二程序根据所述指令数据的存储区、所述指令数据的长度和所述接收数据的存 储区,通过调用所述第三方法,向所述外围设备发送所述命令集; 所述步骤S16,具体为: 所述第二程序获取所述外围设备中的卡片返回给所述外围设备的响应码,根据所述响 应码判断是否向所述外围设备中的卡片发送指令成功,如果是,则执行步骤S7;否则,执行 步骤S9。
10. 如权利要求9所述的方法,其特征在于,所述步骤S5之前,还包括: 所述第二程序根据所述指令数据的存储区和所述指令数据的长度获取指令数据,并对 所述指令数据进行格式转换,得到命令字符串; 所述第二程序根据所述命令字符串和所述外围设备中的卡片的类型组织所述命令集。
11. 如权利要求9所述的方法,其特征在于,所述第二程序根据所述响应码判断出向所 述外围设备中的卡片发送指令成功之后,还包括: 533、 所述第二程序判断所述外围设备中的卡片返回给所述外围设备的指令响应的长 度是否大于第一预设长度,如果是,则执行步骤S34 ;否则,执行步骤S35 ; 534、 所述第二程序将位于所述指令响应末尾、长度为第二预设长度的数据丢弃,并执 行步骤S35 ; 535、 所述第二程序对所述指令响应进行格式转换,将转换得到的响应数据存储到所述 接收数据的存储区中,并将所述响应数据的长度返回给所述第一程序; 536、 所述第一程序判断所述响应数据的长度是否大于零,如果是,则执行步骤S38 ;否 贝1J,执行步骤S37 ; 537、 所述第一程序显示所述发指令失败信息; 538、 所述第一程序根据所述响应数据的长度,从所述接收数据的存储区中读取所述响 应数据。
12. 如权利要求1所述的方法,其特征在于,所述步骤S7之前,还包括: 所述第二程序获取所述外围设备返回的响应码,根据所述响应码判断是否执行成功, 如果是,则执行步骤S7 ;否则,执行步骤S9。
13. 如权利要求12所述的方法,其特征在于,所述功能方法为第四方法,所述类加载器 为第四类加载器,所述类对象为第四类对象,所述功能指令为下电指令,所述执行成功消息 为下电成功消息,所述交互成功信息为下电成功信息,所述执行失败消息为下电失败消息, 所述交互失败信息为下电失败信息; 所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法对应的方 法对象,具体为: 所述第一程序根据所述第四类对象和所述第四方法的名称,获取与所述第四方法对应 的第四方法对象; 所述步骤S4,具体为: 所述第一程序根据所述第四类对象创建第四对象实例,根据所述第四对象实例和所述 第四方法对象,将所述第四方法的名称发送给所述第二程序; 所述步骤S5,具体为: 所述第二程序通过调用所述第四方法,向所述外围设备发送所述下电指令; 所述第二程序根据所述响应码判断是否执行成功,具体为: 所述第二程序根据所述响应码判断所述外围设备中的卡片是否下电成功。
14. 如权利要求1所述的方法,其特征在于,所述步骤S1,具体包括: 所述第一程序将所述第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到所述第二程序的上下文; 所述步骤S2,具体包括: 所述第一程序调用所述第二程序的上下文中的getClassLoader方法,得到所述类 加载器,并将所述第二程序中的功能方法的包名和类名作为参数,调用所述类加载器中的 loadClass方法,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能 方法对应的类对象; 所述步骤S3,具体包括: 所述第一程序将所述功能方法的名称作为参数,调用所述类对象中的 getDeclaredMethod方法,获取与所述功能方法对应的方法对象,并通过调用所述方法对象 中的setAccessible方法,设置所述功能方法的访问控制权限; 所述步骤S4,具体包括: 所述第一程序通过调用所述类对象中的newlnstance方法,创建对象实例,将所述对 象实例作为参数,调用与所述功能方法对应的方法对象中的invoke方法,将所述功能方法 的名称和实际参数发送给所述第二程序。
15. 如权利要求2所述的方法,其特征在于,所述步骤S3,具体包括: 所述第一程序根据所述功能方法的形参类型生成类数组,将所述功能方法的名称和所 述类数组作为参数,调用所述类对象中的getDeclaredMethod方法,获取与所述功能方法 对应的方法对象,并通过调用所述方法对象中的setAccessible方法,设置所述功能方法 的访问控制权限; 所述步骤S4,具体包括: 所述第一程序通过调用所述类对象中的newlnstance方法,仓ij建对象实例,根据所述 功能方法的实际参数生成对象数组,将所述对象实例和所述对象数组作为参数,调用与所 述功能方法对应的方法对象中的invoke方法,将所述功能方法的名称和实际参数发送给 所述第二程序。
16. -种通过Android系统中的方法调用实现与外围设备交互的终端设备,其特征在 于,所述终端设备包括第一程序和第二程序,所述第一程序包括: 第一创建模块,用于根据所述第二程序的包名,创建所述第二程序的上下文; 生成模块,用于根据所述第一创建模块创建的所述第二程序的上下文生成类加载器; 加载模块,用于根据所述生成模块生成的所述类加载器、所述第二程序中的功能方法 的包名和类名,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能 方法对应的类对象; 第一获取模块,用于根据所述加载模块得到的所述类对象和所述功能方法的名称,获 取与所述功能方法对应的方法对象; 第一设置模块,用于根据所述第一获取模块获取到的所述方法对象设置所述功能方法 的访问控制权限; 第二创建模块,用于根据所述加载模块得到的所述类对象创建对象实例; 第一发送模块,用于根据所述第二创建模块创建的所述对象实例以及所述第一获取 模块获取到的与所述功能方法对应的方法对象,将所述功能方法的名称发送给所述第二程 序; 第一接收模块,用于接收所述第二程序返回的执行成功消息或执行失败消息; 显示模块,用于在所述第一接收模块接收到所述执行成功消息时,显示交互成功信息; 在所述第一接收模块接收到所述执行失败消息时,显示交互失败信息; 所述第二程序包括: 第二发送模块,用于通过调用所述功能方法,向所述外围设备发送相应的功能指令; 第一判断模块,用于判断所述第二发送模块是否发送所述功能指令成功; 第三发送模块,用于在所述第一判断模块判断出所述功能指令发送成功时,向所述第 一程序返回所述执行成功消息;在所述第一判断模块判断出所述功能指令未发送成功时, 向所述第一程序返回所述执行失败消息。
17. 如权利要求16所述的终端设备,其特征在于, 所述第一获取模块,具体用于根据所述加载模块得到的所述类对象、所述功能方法的 名称和形参类型,获取与所述功能方法对应的方法对象; 所述第一发送模块,具体用于根据所述第二创建模块创建的所述对象实例以及所述第 一获取模块获取到的与所述功能方法对应的方法对象,将所述功能方法的名称和实际参数 发送给所述第二程序; 所述第二发送模块,具体用于根据所述功能方法的实际参数,通过调用所述功能方法, 向所述外围设备发送相应的功能指令。
18. 如权利要求17所述的终端设备,其特征在于,所述功能方法为第一方法,所述类加 载器为第一类加载器,所述类对象为第一类对象,所述第一方法的实际参数为所述第一程 序的上下文和外围设备连接状态信息,所述功能指令为握手指令,所述执行成功消息为握 手成功消息,所述交互成功信息为握手成功信息,所述执行失败消息为握手失败消息,所述 交互失败信息为握手失败信息; 所述第一获取模块,具体用于根据所述第一类对象、所述第一方法的名称和形参类型, 获取与所述第一方法对应的第一方法对象; 所述第二创建模块,具体用于根据所述第一类对象创建第一对象实例; 所述第一发送模块,具体用于根据所述第一对象实例和所述第一方法对象,将所述第 一方法的名称、所述第一程序的上下文和所述外围设备连接状态信息发送给所述第二程 序; 所述第二发送模块,具体用于根据所述第一程序的上下文和所述外围设备连接状态信 息,通过调用所述第一方法,向所述外围设备发送所述握手指令。
19. 如权利要求18所述的终端设备,其特征在于,所述第二程序,还包括: 第二接收模块,用于接收所述第一程序的上下文和所述外围设备连接状态信息; 初始化模块,用于将所述第二接收模块接收到的所述第一程序的上下文保存到本地, 根据所述第一程序的上下文加载动态库,对通讯库进行初始化; 第二判断模块,用于判断所述第二接收模块接收到的所述第一程序的上下文是否为 空; 第三判断模块,用于在所述第二判断模块判断出所述第一程序的上下文不为空时,根 据所述第二接收模块接收到的所述外围设备连接状态信息判断所述外围设备是否已与所 述终端设备连接上; 第二获取模块,用于在所述第三判断模块判断出所述外围设备已与所述终端设备连接 上时,根据所述第一程序的上下文获取接口实例信息; 所述第三发送模块,还用于在所述第二判断模块判断出所述第一程序的上下文为空, 或者所述第三判断模块判断所述外围设备未与所述终端设备连接上时,向所述第一程序返 回所述握手失败消息。
20. 如权利要求17所述的终端设备,其特征在于,所述第二程序,还包括: 第四判断模块,用于获取所述外围设备返回的响应码,根据所述响应码判断是否执行 成功; 所述第三发送模块,还用于在所述第四判断模块判断出执行成功时,向所述第一程序 返回所述执行成功消息;在所述第四判断模块判断出未执行成功时,向所述第一程序返回 所述执行失败消息。
21. 如权利要求20所述的终端设备,其特征在于,所述功能方法为第二方法,所述类加 载器为第二类加载器,所述类对象为第二类对象,所述第二方法的实际参数为卡片类型信 息,所述功能指令为上电指令,所述执行成功消息为上电成功消息,所述交互成功信息为上 电成功信息,所述执行失败消息为上电失败消息,所述交互失败信息为上电失败信息; 所述第一获取模块,具体用于根据所述第二类对象、所述第二方法的名称和形参类型, 获取与所述第二方法对应的第二方法对象; 所述第二创建模块,具体用于根据所述第二类对象创建第二对象实例; 所述第一发送模块,具体用于根据所述第二对象实例和所述第二方法对象,将所述第 二方法的名称和所述卡片类型信息发送给所述第二程序; 所述第二发送模块,具体用于根据所述卡片类型信息,通过调用所述第二方法,向所述 外围设备发送所述上电指令; 所述第四判断模块,具体用于获取所述外围设备中的卡片返回给所述外围设备的响应 码,根据所述响应码判断所述外围设备中的卡片是否上电成功; 所述第三发送模块,具体用于在所述第四判断模块判断出上电成功时,向所述第一程 序返回所述上电成功消息;在所述第四判断模块判断出未上电成功时,向所述第一程序返 回所述上电失败消息。
22. 如权利要求21所述的终端设备,其特征在于,所述第二程序,还包括: 第二接收模块,用于接收来自所述第一程序的所述卡片类型信息; 第五判断模块,用于根据所述第二接收模块接收到的所述卡片类型信息,对所述外围 设备中的卡片的类型进行判断; 所述第二发送模块,还用于在所述第五判断模块判断出所述卡片的类型为接触卡时, 向所述外围设备发送第一寻卡指令;在所述第五判断模块判断出所述卡片的类型为非接触 卡时,向所述外围设备发送第二寻卡指令; 所述第一判断模块,还用于判断所述第二发送模块是否发送所述第一寻卡指令和所述 第二寻卡指令成功; 所述第三发送模块,还用于在所述第一判断模块判断出所述第一寻卡指令或所述第二 寻卡指令发送失败时,向所述第一程序发送上电失败消息; 所述第二程序,还包括: 第二设置模块,用于在所述第一判断模块判断出所述第一寻卡指令发送成功时,将所 述外围设备中的卡片的类型设置为接触卡,生成所述上电指令,并触发所述第二发送模块 发送所述上电指令;在所述第一判断模块判断出所述第二寻卡指令发送成功时,将所述外 围设备中的卡片的类型设置为非接触卡,生成所述上电指令,并触发所述第二发送模块发 送所述上电指令。
23. 如权利要求22所述的终端设备,其特征在于, 所述第二发送模块,还用于在所述第五判断模块判断出所述卡片的类型为未知时,向 所述外围设备发送第一寻卡指令;在所述第一判断模块判断出所述第一寻卡指令发送失败 时,向所述外围设备发送第二寻卡指令。
24. 如权利要求20所述的终端设备,其特征在于,所述功能方法为第三方法,所述类加 载器为第三类加载器,所述类对象为第三类对象,所述第三方法的实际参数为指令数据的 存储区、指令数据的长度和接收数据的存储区,所述功能指令为命令集,所述执行成功消息 为响应数据的长度,所述交互成功信息为发指令成功信息,所述执行失败消息为错误码,所 述交互失败信息为发指令失败信息; 所述第一获取模块,具体用于根据所述第三类对象、所述第三方法的名称和形参类型, 获取与所述第三方法对应的第三方法对象; 所述第二创建模块,具体用于根据所述第三类对象创建第三对象实例; 所述第一发送模块,具体用于根据所述第三对象实例和所述第三方法对象,将所述第 三方法的名称、所述指令数据的存储区、所述指令数据的长度和所述接收数据的存储区发 送给所述第二程序; 所述第二发送模块,具体用于根据所述指令数据的存储区、所述指令数据的长度和所 述接收数据的存储区,通过调用所述第三方法,向所述外围设备发送所述命令集; 所述第四判断模块,具体用于获取所述外围设备中的卡片返回给所述外围设备的响应 码,根据所述响应码判断是否向所述外围设备中的卡片发送指令成功; 所述第三发送模块,具体用于在所述第四判断模块判断出发送指令成功时,向所述第 一程序返回所述执行成功消息;在所述第四判断模块判断出发送指令失败时,向所述第一 程序返回所述执行失败消息。
25. 如权利要求24所述的终端设备,其特征在于,所述第二程序,还包括: 第二接收模块,用于接收所述指令数据的存储区、所述指令数据的长度和所述接收数 据的存储区; 转换模块,用于根据所述第二接收模块接收到的所述指令数据的存储区和所述指令数 据的长度获取指令数据,并对所述指令数据进行格式转换,得到命令字符串; 组织模块,用于根据所述转换模块转换得到的所述命令字符串和所述外围设备中的卡 片的类型组织所述命令集; 所述第二发送模块,具体用于通过调用所述第三方法,向所述外围设备发送所述组织 模块组织的所述命令集。
26. 如权利要求24所述的终端设备,其特征在于,所述第二程序,还包括: 第六判断模块,用于在所述第四判断模块判断出向所述外围设备中的卡片发送指令成 功后,判断所述外围设备中的卡片返回给所述外围设备的指令响应的长度是否大于第一预 设长度; 处理模块,用于在所述第六判断模块判断出所述指令响应的长度大于第一预设长度 时,将位于所述指令响应末尾、长度为第二预设长度的数据丢弃,并对所述指令响应进行格 式转换,将转换得到的响应数据存储到所述接收数据的存储区中,并将所述响应数据的长 度返回给所述第一程序;在所述第六判断模块判断出所述指令响应的长度不大于第一预设 长度时,对所述指令响应进行格式转换,将转换得到的响应数据存储到所述接收数据的存 储区中,并将所述响应数据的长度返回给所述第一程序; 所述第一接收模块,还用于接收所述响应数据的长度; 所述第一程序,还包括: 第七判断模块,用于判断所述第一接收模块接收到的所述响应数据的长度是否大于 零; 读取模块,用于在所述第七判断模块判断出所述响应数据的长度大于零时,根据所述 响应数据的长度,从所述接收数据的存储区中读取所述响应数据; 所述显示模块,还用于在所述第七判断模块判断出所述响应数据的长度不大于零时, 显示所述发指令失败信息。
27. 如权利要求16所述的终端设备,其特征在于,所述第二程序,还包括: 第四判断模块,用于获取所述外围设备返回的响应码,根据所述响应码判断是否执行 成功; 所述第三发送模块,还用于在所述第四判断模块判断出执行成功时,向所述第一程序 返回所述执行成功消息;在所述第四判断模块判断出未执行成功时,向所述第一程序返回 所述执行失败消息。
28. 如权利要求27所述的终端设备,其特征在于,所述功能方法为第四方法,所述类加 载器为第四类加载器,所述类对象为第四类对象,所述功能指令为下电指令,所述执行成功 消息为下电成功消息,所述交互成功信息为下电成功信息,所述执行失败消息为下电失败 消息,所述交互失败信息为下电失败信息; 所述第一获取模块,具体用于根据所述第四类对象和所述第四方法的名称,获取与所 述第四方法对应的第四方法对象; 所述第二创建模块,具体用于根据所述第四类对象创建第四对象实例; 所述第一发送模块,具体用于根据所述第四对象实例和所述第四方法对象,将所述第 四方法的名称发送给所述第二程序; 所述第二发送模块,具体用于通过调用所述第四方法,向所述外围设备发送所述下电 指令; 所述第四判断模块,具体用于获取所述外围设备返回的响应码,根据所述响应码判断 所述外围设备中的卡片是否下电成功。
29. 如权利要求16所述的终端设备,其特征在于, 所述第一创建模块,具体用于将所述第二程序的包名和预设标记值作为参数,调用 createPackageContext方法,得到所述第二程序的上下文; 所述生成模块,具体用于调用所述第二程序的上下文中的getClassLoader方法,得到 所述类加载器; 所述加载模块,具体用于将所述第二程序中的功能方法的包名和类名作为参数,调用 所述类加载器中的loadClass方法,将所述功能方法所属的类加载到所述第一程序的进程 中,得到与所述功能方法对应的类对象; 所述第一获取模块,具体用于将所述功能方法的名称作为参数,调用所述类对象中的 getDeclaredMethod方法,获取与所述功能方法对应的方法对象; 所述第一设置模块,具体用于通过调用所述方法对象中的setAccessible方法,设置 所述功能方法的访问控制权限; 所述第二创建模块,具体用于通过调用所述类对象中的newlnstance方法,仓ij建对象 实例; 所述第一发送模块,具体用于将所述对象实例作为参数,调用与所述功能方法对应的 方法对象中的invoke方法,将所述功能方法的名称和实际参数发送给所述第二程序。
30. 如权利要求17所述的终端设备,其特征在于, 所述第一获取模块,具体用于根据所述功能方法的形参类型生成类数组,将所述功能 方法的名称和所述类数组作为参数,调用所述类对象中的getDeclaredMethod方法,获取 与所述功能方法对应的方法对象; 所述第一发送模块,具体用于根据所述功能方法的实际参数生成对象数组,将所述对 象实例和所述对象数组作为参数,调用与所述功能方法对应的方法对象中的invoke方法, 将所述功能方法的名称和实际参数发送给所述第二程序。
【文档编号】G06F3/01GK104090654SQ201410291252
【公开日】2014年10月8日 申请日期:2014年6月25日 优先权日:2014年6月25日
【发明者】陆舟, 于华章 申请人:飞天诚信科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1