CN104090654A - 一种通过方法调用实现与外围设备交互的方法和设备 - Google Patents
一种通过方法调用实现与外围设备交互的方法和设备 Download PDFInfo
- Publication number
- CN104090654A CN104090654A CN201410291252.4A CN201410291252A CN104090654A CN 104090654 A CN104090654 A CN 104090654A CN 201410291252 A CN201410291252 A CN 201410291252A CN 104090654 A CN104090654 A CN 104090654A
- Authority
- CN
- China
- Prior art keywords
- program
- peripherals
- module
- card
- instruction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Telephone Function (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种通过Android系统中的方法调用实现与外围设备交互的方法和设备,该方法应用于包括终端设备和外围设备的系统中,该终端设备包括第一程序和第二程序,第一程序创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,并通过反射机制实现对第二程序中的方法的调用,进而实现与外围设备的交互,实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
Description
技术领域
本发明涉及计算机技术领域,特别是涉及一种通过方法调用实现与外围设备交互的方法和设备。
背景技术
随着计算机技术的发展,作为一种基于Linux的自由及开放源代码的操作系统,Android系统已广泛地应用于手机、平板电脑,以及其他终端设备中,基于Android系统的应用程序的种类也日渐繁多,涵盖了办公、资讯、生活、购物、理财、阅读、娱乐和游戏等领域,给用户提供了很大的便利。
在实际使用中,用户通常需要在Android系统中同时运行多个应用程序,由于不同的应用程序之间无法共享资源,因此容易造成对Android系统的内存资源的大量占用,从而降低了应用程序运行的流畅度,损害了用户的使用体验,并对设备硬件提出了更高的要求,降低了应用程序的设备兼容性。
发明内容
本发明提供了一种通过Android系统中的方法调用实现与外围设备交互的方法和设备,用以解决现有技术中对内存资源大量占用以及设备兼容性低的缺陷。
本发明提供了一种通过Android系统中的方法调用实现与外围设备交互的方法,应用于包括终端设备和外围设备的系统中,所述终端设备包括第一程序和第二程序,所述方法包括以下步骤:
S1、所述第一程序根据所述第二程序的包名,创建所述第二程序的上下文;
S2、所述第一程序根据所述第二程序的上下文生成类加载器,并根据所述类加载器、所述第二程序中的功能方法的包名和类名,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能方法对应的类对象;
S3、所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法对应的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限;
S4、所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述功能方法对应的方法对象,将所述功能方法的名称发送给所述第二程序;
S5、所述第二程序通过调用所述功能方法,向所述外围设备发送相应的功能指令;
S6、所述第二程序判断所述功能指令是否发送成功,如果是,则执行步骤S7;否则,执行步骤S9;
S7、所述第二程序向所述第一程序返回执行成功消息;
S8、所述第一程序显示交互成功信息,结束流程;
S9、所述第二程序向所述第一程序返回执行失败消息;
S10、所述第一程序显示交互失败信息,结束流程。
本发明还提供了一种通过Android系统中的方法调用实现与外围设备交互的终端设备,所述终端设备包括第一程序和第二程序,所述第一程序包括:
第一创建模块,用于根据所述第二程序的包名,创建所述第二程序的上下文;
生成模块,用于根据所述第一创建模块创建的所述第二程序的上下文生成类加载器;
加载模块,用于根据所述生成模块生成的所述类加载器、所述第二程序中的功能方法的包名和类名,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能方法对应的类对象;
第一获取模块,用于根据所述加载模块得到的所述类对象和所述功能方法的名称,获取与所述功能方法对应的方法对象;
第一设置模块,用于根据所述第一获取模块获取到的所述方法对象设置所述功能方法的访问控制权限;
第二创建模块,用于根据所述加载模块得到的所述类对象创建对象实例;
第一发送模块,用于根据所述第二创建模块创建的所述对象实例以及所述第一获取模块获取到的与所述功能方法对应的方法对象,将所述功能方法的名称发送给所述第二程序;
第一接收模块,用于接收所述第二程序返回的执行成功消息或执行失败消息;
显示模块,用于在所述第一接收模块接收到所述执行成功消息时,显示交互成功信息;在所述第一接收模块接收到所述执行失败消息时,显示交互失败信息;
所述第二程序包括:
第二发送模块,用于通过调用所述功能方法,向所述外围设备发送相应的功能指令;
第一判断模块,用于判断所述第二发送模块是否发送所述功能指令成功;
第三发送模块,用于在所述第一判断模块判断出所述功能指令发送成功时,向所述第一程序返回执行成功消息;在所述第一判断模块判断出所述功能指令未发送成功时,向所述第一程序返回执行失败消息。
本发明达到的有益效果:第一程序创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,并通过反射机制实现对第二程序中的方法的调用,进而实现与外围设备的交互,实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
附图说明
图1为本发明实施例中的一种通过Android系统中的方法调用实现与外围设备交互的方法流程图;
图2至图6为本发明实施例中的另一种通过Android系统中的方法调用实现与外围设备交互的方法流程图。
图7为本发明实施例中的一种通过Android系统中的方法调用实现与外围设备交互的终端设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供了一种通过Android系统中的方法调用实现与外围设备交互的方法,该方法应用于包括第一程序、第二程序和外围设备的系统中,第一程序通过调用第二程序中的功能方法,与外围设备交互,具体流程如图1所示,包括以下步骤:
步骤101,第一程序根据第二程序的包名,创建第二程序的上下文。
具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序的上下文。
其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
本实施例中,第一选项为“CONTEXT_INCLUDE_CODE”,第二选项为“CONTEXT_IGNORE_SECURITY”。
例如,第二程序的包名为“PACKAGE_TEST_B”时,第一程序将“CONTEXT_INCLUDE_CODE|CONTEXT_IGNORE_SECURITY”和“PACKAGE_TEST_B”作为参数,调用createPackageContext方法,得到第二程序的上下文Ctx。
步骤102,第一程序根据第二程序的上下文生成类加载器,通过该类加载器将第二程序中的功能方法所属的类加载到第一程序的进程中,得到与该功能方法对应的类对象。
具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到类加载器,并将第二程序中的功能方法的包名和类名作为参数,调用上述类加载器中的loadClass方法,将第二程序中的功能方法所属的类加载到第一程序的进程中,得到与该功能方法对应的类对象。
例如,第二程序的上下文为Ctx,第二程序中的功能方法为handleHeadSet方法,该handleHeadSet方法包含在名称为“TestApi”的类中,上述名称为“TestApi”的类包含在名称为“com.icbc.audio.driver”的包中,则handleHeadSet方法的包名为“com.icbc.audio.driver”,类名为“TestApi”,第一程序调用Ctx中的getClassLoader方法,得到类加载器classLoader1,并将“com.icbc.audio.driver.TestApi”作为参数,调用classLoader1中的loadClass方法,将handleHeadSet方法所属的、名称为“TestApi”的类加载到第一程序的进程中,并得到与handleHeadSet方法对应的类对象cls1。
步骤103,第一程序根据与功能方法对应的类对象和该功能方法的名称,获取与该功能方法对应的方法对象,并根据该方法对象设置功能方法的访问控制权限。
具体地,当功能方法没有参数时,第一程序可以将功能方法的名称作为参数,调用与功能方法对应的类对象中的getDeclaredMethod方法,获取与功能方法对应的方法对象,并通过调用该方法对象中的setAccessible方法,设置功能方法的访问控制权限。
当功能方法有参数时,第一程序可以根据功能方法的形参类型生成类数组,将功能方法的名称和类数组作为参数,调用与功能方法对应的类对象中的getDeclaredMethod方法,获取与功能方法对应的方法对象,并通过调用该方法对象中的setAccessible方法,设置功能方法的访问控制权限。其中,上述类数组中的元素为与功能方法的形参类型对应的类文件。
例如,功能方法为handleHeadSet方法,handleHeadSet方法具有两个形参,其类型分别为context类型和boolean类型,则类数组中的元素为context.class和boolean.class,第一程序将“handleHeadSet”和{context.class,boolean.class}作为参数,调用类对象cls1中的getDeclaredMethod方法,获取与handleHeadSet方法对应的方法对象handMethod1,将布尔型常数“true”作为参数,调用方法对象handMethod1中的setAccessible方法,将功能方法的访问控制权限设置为跳过访问检查。
步骤104,第一程序根据与功能方法对应的类对象创建对象实例,根据该对象实例以及与功能方法对应的方法对象,将功能方法的名称和实际参数发送给第二程序。
具体地,第一程序可以通过调用与功能方法对应的类对象中的newInstance方法,创建对象实例,根据功能方法的实际参数生成对象数组,将上述对象实例和对象数组作为参数,调用与功能方法对应的方法对象中的invoke方法,将功能方法的名称和实际参数发送给第二程序。
例如,功能方法为handleHeadSet方法,其实际参数包括第一程序的上下文ctx和外围设备连接状态信息action,则第一程序调用类对象cls1中的newInstance方法,创建对象实例obj1。第一程序生成的对象数组中的元素为ctx和action,第一程序将obj1和{ctx,action}作为参数,调用handMethod1中的invoke方法,将功能方法的名称“handleHeadSet”、第一程序的上下文ctx和外围设备连接状态信息action发送给第二程序。
步骤105,第二程序根据功能方法的实际参数,通过调用该功能方法向外围设备发送相应的功能指令。
例如,第二程序根据第一程序的上下文ctx和外围设备连接状态信息action,通过调用handleHeadSet方法向外围设备发送握手指令。
步骤106,第二程序判断功能指令是否发送成功,如果是,则执行步骤107;否则,执行步骤109。
例如,第二程序判断握手指令是否发送成功。
步骤107,第二程序向第一程序返回执行成功消息。
例如,第二程序向第一程序返回执行成功消息“ok”。
步骤108,第一程序显示交互成功信息,结束流程。
例如,第一程序显示“与外围设备连接成功”。
步骤109,第二程序向第一程序返回执行失败消息。
例如,第一程序显示执行失败消息“error”。
步骤110,第一程序显示交互失败信息,结束流程。
例如,第一程序显示“与外围设备连接失败”。
本发明实施例提供的技术方案中,第一程序根据第二程序的包名创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,并通过反射机制实现对第二程序中的方法的调用,进而实现与外围设备的交互,实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
需要说明的是,在本发明的其他实施方式中,功能方法可以是无参数的方法,相应地,第一程序根据类加载器创建对象实例后,根据该对象实例以及与功能方法对应的方法对象,将功能方法的名称发送给第二程序;第二程序通过调用上述功能方法向外围设备发送相应的功能指令,同样可以实现本发明的发明目的。
另外,在本发明的其他实施方式中,第二程序判断出功能指令发送成功后,获取外围设备返回的响应码,根据该响应码判断是否执行成功,如果是,则向第一程序返回执行成功消息;否则,向第一程序返回执行失败消息,同样可以实现本发明的发明目的。
进一步地,本发明实施例中的一种通过Android系统中的方法调用实现与外围设备交互的方法,可应用于包括终端设备和外围设备的系统中,该终端设备采用Android系统,并安装有第一程序和第二程序,第二程序中的功能方法包括第一方法、第二方法、第三方法和第四方法,第一程序可调用上述功能方法,分别实现与外围设备建立连接、对外围设备中的卡片上电、向外围设备中的卡片发指令以及对外围设备中的卡片下电的功能,对应的流程如图2至图6所示,包括以下步骤:
步骤201,第一程序等待被触发。
步骤202,第一程序对被触发的按键进行判断,如果是第一按键,则执行步骤203;如果是第二按键,则执行步骤216;如果是第三按键,则执行步骤254;如果是第四按键,则执行步骤272。
本实施例中,第一按键为握手键,第二按键为上电键,第三按键为发指令键,第四按键为下电键。
步骤203,第一程序根据第二程序的包名,创建第二程序的上下文。
具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序的上下文。
其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
本实施例中,第一选项为“CONTEXT_INCLUDE_CODE”,第二选项为“CONTEXT_IGNORE_SECURITY”。
例如,第二程序的包名为“PACKAGE_TEST_B”时,第一程序将“CONTEXT_INCLUDE_CODE|CONTEXT_IGNORE_SECURITY”和“PACKAGE_TEST_B”作为参数,调用createPackageContext方法,得到第二程序的上下文Ctx。
步骤204,第一程序根据第二程序的上下文生成第一类加载器,通过第一类加载器将第一方法所属的类加载到第一程序的进程中,得到第一类对象。
具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第一类加载器,并将第一方法的包名和类名作为参数,调用第一类加载器中的loadClass方法,将第一方法所属的类加载到第一程序的进程中,得到第一类对象。
例如,第二程序的上下文为Ctx,第一方法为handleHeadSet方法,该handleHeadSet方法包含在名称为“TestApi”的类中,上述名称为“TestApi”的类包含在名称为“com.icbc.audio.driver”的包中,则handleHeadSet方法的包名为“com.icbc.audio.driver”,类名为“TestApi”,第一程序调用Ctx中的getClassLoader方法,得到第一类加载器classLoader1,并将“com.icbc.audio.driver.TestApi”作为参数,调用classLoader1中的loadClass方法,将handleHeadSet方法所属的、名称为“TestApi”的类加载到第一程序的进程中,并得到第一类对象cls1。
步骤205,第一程序根据第一类对象、第一方法的名称和形参类型,获取与第一方法对应的第一方法对象。
具体地,第一程序可以根据第一方法的形参类型生成第一类数组,将第一方法的名称和第一类数组作为参数,调用第一类对象中的getDeclaredMethod方法,获取与第一方法对应的第一方法对象。其中,上述第一类数组中的元素为与第一方法的形参类型对应的类文件。
例如,第一方法为handleHeadSet方法,handleHeadSet方法具有两个形参,其类型分别为context类型和boolean类型,则第一类数组中的元素为context.class和boolean.class,第一程序将“handleHeadSet”和{context.class,boolean.class}作为参数,调用第一类对象cls1中的getDeclaredMethod方法,获取与handleHeadSet方法对应的第一方法对象handMethod1。
步骤206,第一程序根据第一方法对象,设置第一方法的访问控制权限。
具体地,第一程序可以通过调用第一方法对象中的setAccessible方法,设置第一方法的访问控制权限。
本实施例中,第一程序可以将布尔型常数“true”作为参数,调用第一方法对象handMethod1中的setAccessible方法,将第一方法的访问控制权限设置为跳过访问检查。
步骤207,第一程序根据第一类对象创建第一对象实例。
具体地,第一程序可以通过调用第一类对象中的newInstance方法,创建第一对象实例。
例如,第一程序调用第一类对象cls1中的newInstance方法,创建第一对象实例obj1。
步骤208,第一程序根据第一对象实例和第一方法对象,将第一方法的名称、第一程序的上下文和外围设备连接状态信息发送给第二程序。
具体地,第一程序可以根据第一程序的上下文和外围设备连接状态信息生成第一对象数组,将第一对象实例和第一对象数组作为参数,调用第一方法对象中的invoke方法,将第一方法的名称、第一程序的上下文和外围设备连接状态信息发送给第二程序。
例如,第一程序的上下文为ctx,外围设备连接状态信息为action,第一对象实例为obj1,第一方法对象为handMethod1,第一方法为handleHeadSet方法,则第一对象数组中的元素为ctx和action,第一程序将obj1和{ctx,action}作为参数,调用handMethod1中的invoke方法,将第一方法的名称“handleHeadSet”、第一程序的上下文ctx和外围设备连接状态信息action发送给第二程序。
步骤209,第二程序将第一程序的上下文保存到本地,根据该上下文加载动态库,对通讯库进行初始化。
具体地,第二程序可以将第一程序的上下文作为参数,调用AudioToken类中的getInstance方法,从而加载动态库,对通讯库进行初始化。
步骤210,第二程序判断第一程序的上下文是否为空,如果是,则执行步骤211;否则,执行步骤212。
步骤211,第二程序向第一程序返回握手失败消息,第一程序显示握手失败信息,并返回步骤201。
例如,第二程序向第一程序返回握手失败消息“error”,第一程序显示“与外围设备连接失败”。
步骤212,第二程序根据外围设备连接状态信息判断外围设备是否已与终端设备连接上,如果是,则执行步骤213;否则,返回步骤211。
例如,外围设备连接状态信息为action时,第二程序可以判断action的取值是否为“true”,如果是,则确定外围设备已与终端设备连接上;否则,确定外围设备没有与终端设备连接上。
步骤213,第二程序根据第一程序的上下文获取接口实例信息,向外围设备发送握手指令。
具体地,第二程序可以将第一程序的上下文作为参数,调用ApiImpl类中的getInstance方法,获取接口实例信息,并调用ApiImpl类中的handShake方法,向外围设备发送握手指令。
步骤214,第二程序判断握手指令是否发送成功,如果是,则执行步骤215;否则,返回步骤211。
具体地,第二程序可以判断handShake方法的返回值是否为第一预设值,如果是,则确定握手指令发送成功;否则,确定握手指令发送未成功。其中,第一预设值可以为0。
步骤215,第二程序向第一程序返回握手成功消息,第一程序显示握手成功信息,并返回步骤201。
例如,第二程序向第一程序返回握手成功消息“ok”,第一程序显示“与外围设备连接成功”。
步骤216,第一程序根据第二程序的包名,创建第二程序的上下文。
具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序的上下文。
其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
本实施例中,第一选项为“CONTEXT_INCLUDE_CODE”,第二选项为“CONTEXT_IGNORE_SECURITY”。
例如,第二程序的包名为“PACKAGE_TEST_B”时,第一程序将“CONTEXT_INCLUDE_CODE|CONTEXT_IGNORE_SECURITY”和“PACKAGE_TEST_B”作为参数,调用createPackageContext方法,得到第二程序的上下文Ctx。
步骤217,第一程序根据第二程序的上下文生成第二类加载器,通过第二类加载器将第二方法所属的类加载到第一程序的进程中,得到第二类对象。
具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第二类加载器,并将第二方法的包名和类名作为参数,调用第二类加载器中的loadClass方法,将第二方法所属的类加载到第一程序的进程中,得到第二类对象。
例如,第二程序的上下文为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。
步骤218,第一程序根据第二类对象、第二方法的名称和形参类型,获取与第二方法对应的第二方法对象。
具体地,第一程序可以根据第二方法的形参类型生成第二类数组,将第二方法的名称和第二类数组作为参数,调用第二类对象中的getDeclaredMethod方法,获取与第二方法对应的第二方法对象。其中,上述第二类数组中的元素为与第二方法的形参类型对应的类文件。
例如,第二方法为cardPowerON方法,cardPowerON方法具有一个形参,该形参的类型为Byte类型,则第二类数组中的元素为Byte.class,第一程序将“cardPowerON”和{Byte.class}作为参数,调用第二类对象cls2中的getDeclaredMethod方法,获取与cardPowerON方法对应的第二方法对象handMethod2。
步骤219,第一程序根据第二方法对象,设置第二方法的访问控制权限。
具体地,第一程序可以通过调用第二方法对象中的setAccessible方法,设置第二方法的访问控制权限。
本实施例中,第一程序可以将布尔型常数“true”作为参数,调用第二方法对象handMethod2中的setAccessible方法,将第二方法的访问控制权限设置为跳过访问检查。
步骤220,第一程序根据第二类对象创建第二对象实例。
具体地,第一程序可以通过调用第二类对象中的newInstance方法,创建第二对象实例。
例如,第一程序调用第二类对象cls2中的newInstance方法,创建第二对象实例obj2。
步骤221,第一程序根据第二对象实例和第二方法对象,将第二方法的名称和卡片类型信息发送给第二程序。
具体地,第一程序可以根据卡片类型信息生成第二对象数组,将第二对象实例和第二对象数组作为参数,调用第二方法对象中的invoke方法,将第二方法的名称和卡片类型信息发送给第二程序。
例如,卡片类型信息为CardType,第二对象实例为obj2,第二方法对象为handMethod2,第二方法为CardPowerON方法,则第二对象数组中的元素为CardType,第一程序将obj2和{CardType}作为参数,调用handMethod2中的invoke方法,将第二方法的名称“CardPowerON”和卡片类型信息CardType发送给第二程序。
步骤222,第二程序根据接收到的卡片类型信息,对外围设备中的卡片的类型进行判断,如果是接触卡,则执行步骤223;如果是非接触卡,则执行步骤231;如果是未知,则执行步骤239。
具体地,第二程序可以对卡片类型信息的取值进行判断,如果是第二预设值,则确定外围设备中的卡片的类型为接触卡;如果是第三预设值,则确定外围设备中的卡片的类型为非接触卡;如果是其他数值,则确定外围设备中的卡片的类型为未知。
例如,卡片类型信息为CardType,第二预设值为1,第三预设值为2,第二程序对CardType的取值进行判断,如果是1,则确定外围设备中的卡片的类型为接触卡;如果是2,则确定外围设备中的卡片的类型为非接触卡;如果是其他数值,则确定外围设备中的卡片的类型为未知。
步骤223,第二程序向外围设备发送第一寻卡指令。
具体地,第二程序可以通过调用findCard_contact方法,向外围设备发送第一寻卡指令。
步骤224,第二程序判断第一寻卡指令是否发送成功,如果是,则执行步骤226;否则,执行步骤225。
具体地,第二程序可以判断findCard_contact方法的返回值是否为第四预设值,如果是,则确定第一寻卡指令发送成功;否则,确定第一寻卡指令发送未成功。其中,第四预设值可以为0。
步骤225,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息,并返回步骤201。
例如,第二程序向第一程序返回“false”,第一程序显示“上电失败”。
步骤226,第二程序将外围设备中的卡片的类型设置为接触卡,生成上电指令,并根据接口实例信息,将该上电指令发送给外围设备。
具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
步骤227,第二程序判断上电指令是否发送成功,如果是,则执行步骤228;否则,返回步骤225。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第五预设值,如果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第五预设值可以为0。
步骤228,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤229,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功,如果是,则执行步骤230;否则,返回步骤225。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第六预设值,则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第六预设值可以是“00”。
步骤230,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息,并返回步骤201。
例如,第二程序向第一程序返回“true”,第一程序显示“上电成功”。
步骤231,第二程序向外围设备发送第二寻卡指令。
具体地,第二程序可以通过调用findCard_nontact方法,向外围设备发送第二寻卡指令。
步骤232,第二程序判断第二寻卡指令是否发送成功,如果是,则执行步骤234;否则,执行步骤233。
具体地,第二程序可以判断findCard_nontact方法的返回值是否为第七预设值,如果是,则确定第二寻卡指令发送成功;否则,确定第二寻卡指令发送未成功。其中,第七预设值可以为0。
步骤233,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息,并返回步骤201。
例如,第二程序向第一程序返回“false”,第一程序显示“上电失败”。
步骤234,第二程序将外围设备中的卡片的类型设置为非接触卡,生成上电指令,并根据接口实例信息将该上电指令发送给外围设备。
具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
步骤235,第二程序判断上电指令是否发送成功,如果是,则执行步骤236;否则,返回步骤233。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第八预设值,如果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第八预设值可以为0。
步骤236,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤237,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功,如果是,则执行步骤238;否则,返回步骤233。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第九预设值,则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第九预设值可以是“00”。
步骤238,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息,并返回步骤201。
例如,第二程序向第一程序返回“true”,第一程序显示“上电成功”。
步骤239,第二程序向外围设备发送第一寻卡指令。
具体地,第二程序可以通过调用findCard_contact方法,向外围设备发送第一寻卡指令。
步骤240,第二程序判断第一寻卡指令是否发送成功,如果是,则执行步骤241;否则,执行步骤246。
具体地,第二程序可以判断findCard_contact方法的返回值是否为第十预设值,如果是,则确定第一寻卡指令发送成功;否则,确定第一寻卡指令发送未成功。其中,第十预设值可以为0。
步骤241,第二程序将外围设备中的卡片的类型设置为接触卡,生成上电指令,并根据接口实例信息将该上电指令发送给外围设备。
具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
步骤242,第二程序判断上电指令是否发送成功,如果是,则执行步骤243;否则,执行步骤246。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第十一预设值,如果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十一预设值可以为0。
步骤243,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤244,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功,如果是,则执行步骤245;否则,执行步骤246。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十二预设值,则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第十二预设值可以是“00”。
步骤245,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息,并返回步骤201。
例如,第二程序向第一程序返回“true”,第一程序显示“上电成功”。
步骤246,第二程序向外围设备发送第二寻卡指令。
具体地,第二程序可以通过调用findCard_nontact方法,向外围设备发送第二寻卡指令。
步骤247,第二程序判断第二寻卡指令是否发送成功,如果是,则执行步骤249;否则,执行步骤248。
具体地,第二程序可以判断findCard_nontact方法的返回值是否为第十三预设值,如果是,则确定第二寻卡指令发送成功;否则,确定第二寻卡指令发送未成功。其中,第十三预设值可以为0。
步骤248,第二程序向第一程序发送上电失败消息,第一程序显示上电失败信息,并返回步骤201。
例如,第二程序向第一程序返回“false”,第一程序显示“上电失败”。
步骤249,第二程序将外围设备中的卡片的类型设置为非接触卡,生成上电指令,并根据接口实例信息将该上电指令发送给外围设备。
具体地,第二程序可以调用PackData类中的packPowerOnData方法,生成上电指令,并调用接口实例信息中的transmitApdu方法,将上电指令发送给外围设备。
步骤250,第二程序判断上电指令是否发送成功,如果是,则执行步骤251;否则,返回步骤248。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第十四预设值,如果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十四预设值可以为0。
步骤251,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤252,第二程序根据获取到的响应码,判断外围设备中的卡片是否上电成功,如果是,则执行步骤253;否则,返回步骤248。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十五预设值,则确定外围设备中的卡片上电成功;否则,确定外围设备中的卡片上电未成功。其中,第十五预设值可以是“00”。
步骤253,第二程序向第一程序发送上电成功消息,第一程序显示上电成功信息,并返回步骤201。
例如,第二程序向第一程序返回“true”,第一程序显示“上电成功”。
步骤254,第一程序根据第二程序的包名,创建第二程序的上下文。
具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序的上下文。
其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
本实施例中,第一选项为“CONTEXT_INCLUDE_CODE”,第二选项为“CONTEXT_IGNORE_SECURITY”。
例如,第二程序的包名为“PACKAGE_TEST_B”时,第一程序将“CONTEXT_INCLUDE_CODE|CONTEXT_IGNORE_SECURITY”和“PACKAGE_TEST_B”作为参数,调用createPackageContext方法,得到第二程序的上下文Ctx。
步骤255,第一程序根据第二程序的上下文生成第三类加载器,通过第三类加载器将第三方法所属的类加载到第一程序的进程中,得到第三类对象。
具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第三类加载器,并将第三方法的包名和类名作为参数,调用第三类加载器中的loadClass方法,将第三方法所属的类加载到第一程序的进程中,得到第三类对象。
例如,第二程序的上下文为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。
步骤256,第一程序根据第三类对象、第三方法的名称和形参类型,获取与第三方法对应的第三方法对象。
具体地,第一程序可以根据第三方法的形参类型生成第三类数组,将第三方法的名称和第三类数组作为参数,调用第三类对象中的getDeclaredMethod方法,获取与第三方法对应的第三方法对象。其中,上述第三类数组中的元素为与第三方法的形参类型对应的类文件。
例如,第三方法为CardtransCommand方法,CardtransCommand方法具有三个形参,其类型分别为byte[]类型、int类型和byte[]类型,则第三类数组中的元素为byte[].class、int.class和byte[].class,第一程序将“CardtransCommand”和{byte[].class,int.class,byte[].class}作为参数,调用第三类对象cls3中的getDeclaredMethod方法,获取与CardtransCommand方法对应的第三方法对象handMethod3。
步骤257,第一程序根据第三方法对象,设置第三方法的访问控制权限。
具体地,第一程序可以通过调用第三方法对象中的setAccessible方法,设置第三方法的访问控制权限。
本实施例中,第一程序可以将布尔型常数“true”作为参数,调用第三方法对象handMethod3中的setAccessible方法,将第三方法的访问控制权限设置为跳过访问检查。
步骤258,第一程序根据第三类对象创建第三对象实例。
具体地,第一程序可以通过调用第三类对象中的newInstance方法,创建第三对象实例。
例如,第一程序调用第三类对象cls3中的newInstance方法,创建第三对象实例obj3。
步骤259,第一程序根据第三对象实例和第三方法对象,将第三方法的名称、指令数据的存储区、指令数据的长度和接收数据的存储区发送给第二程序。
具体地,第一程序可以根据指令数据的存储区、指令数据的长度和接收数据的存储区生成第三对象数组,将第三对象实例和第三对象数组作为参数,调用第三方法对象中的invoke方法,将第三方法的名称、指令数据的存储区、指令数据的长度和接收数据的存储区发送给第二程序。
例如,指令数据的存储区为cmd,指令数据的长度为cmdLen,接收数据的存储区为res,第三对象实例为obj3,第三方法对象为handMethod3,第三方法为CardtransCommand方法,则第三对象数组中的元素为cmd、cmdLen和res,第一程序将obj3和{cmd,cmdLen,res}作为参数,调用handMethod3中的invoke方法,将第三方法的名称“CardtransCommand”、指令数据的存储区cmd、指令数据的长度cmdLen和接收数据的存储区res发送给第二程序。
步骤260,第二程序根据指令数据的存储区和指令数据的长度获取指令数据,并对该指令数据进行格式转换,得到命令字符串。
具体地,第二程序可以将指令数据作为参数,调用Convert类中的Bytes2HexString方法,将指令数据转换为命令字符串,其中,命令字符串可以为16进制的字符串。
步骤261,第二程序根据转换得到的命令字符串和外围设备中的卡片的类型组织命令集,并根据接口实例信息向外围设备发送命令集。
具体地,第二程序可以将命令字符串和外围设备中的卡片的类型作为参数,调用PackData类中的packApduData方法,组织命令集,并将组织得到的命令集作为参数,调用接口实例信息中的transmitApdu方法,向外围设备发送命令集。
步骤262,第二程序判断命令集是否发送成功,如果是,则执行步骤264;否则,执行步骤263。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第十六预设值,如果是,则确定上电指令发送成功;否则,确定上电指令发送未成功。其中,第十六预设值可以为0。
步骤263,第二程序向第一程序发送错误码,第一程序显示发指令失败信息,并返回步骤201。
例如,第二程序向第一程序返回“error”,第一程序显示“指令发送失败”。
步骤264,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤265,第二程序根据获取到的响应码,判断是否向外围设备中的卡片发送指令成功,如果是,则执行步骤266;否则,返回步骤263。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十七预设值,则确定向外围设备中的卡片发送指令成功;否则,确定向外围设备中的卡片发送指令未成功。其中,第十七预设值可以是“00”。
步骤266,第二程序判断卡片返回给外围设备的指令响应的长度是否大于第一预设长度,如果是,则执行步骤267;否则,执行步骤268。
例如,第一预设长度为8字节。
步骤267,第二程序将位于指令响应末尾、长度为第二预设长度的数据丢弃。
例如,第二预设长度为4字节。
需要说明的是,执行完本步骤后,继续执行步骤268。
步骤268,第二程序对指令响应进行格式转换,将转换得到的响应数据存储到接收数据的存储区中,并将响应数据的长度返回给第一程序。
具体地,第二程序可以将指令响应作为参数,调用Convert类中的hexToBytes方法,将指令响应转换为响应数据存储到接收数据的存储区中,并将响应数据的长度返回给第一程序。
步骤269,第一程序判断响应数据的长度是否大于零,如果是,则执行步骤271;否则,执行步骤270。
步骤270,第一程序显示发指令失败信息,并返回步骤201。
例如,第一程序显示“指令发送失败”。
步骤271,第一程序根据响应数据的长度,从接收数据的存储区中读取响应数据,并返回步骤201。
步骤272,第一程序根据第二程序的包名,创建第二程序的上下文。
具体地,第一程序可以将第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序的上下文。
其中,预设标记值包括有第一选项和第二选项,第一选项用于表示执行第二程序的包名所对应的包中的代码,第二选项用于表示忽略安全警告。
本实施例中,第一选项为“CONTEXT_INCLUDE_CODE”,第二选项为“CONTEXT_IGNORE_SECURITY”。
例如,第二程序的包名为“PACKAGE_TEST_B”时,第一程序将“CONTEXT_INCLUDE_CODE|CONTEXT_IGNORE_SECURITY”和“PACKAGE_TEST_B”作为参数,调用createPackageContext方法,得到第二程序的上下文Ctx。
步骤273,第一程序根据第二程序的上下文生成第四类加载器,通过第四类加载器将第四方法所属的类加载到第一程序的进程中,得到第四类对象。
具体地,第一程序可以调用第二程序的上下文中的getClassLoader方法,得到第四类加载器,并将第四方法的包名和类名作为参数,调用第四类加载器中的loadClass方法,将第四方法所属的类加载到第一程序的进程中,得到第四类对象。
例如,第二程序的上下文为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。
步骤274,第一程序根据第四类对象和第四方法的名称,获取与第四方法对应的第四方法对象。
具体地,第一程序可以根据第四方法的形参类型生成第四类数组,将第四方法的名称和第四类数组作为参数,调用第四类对象中的getDeclaredMethod方法,获取与第四方法对应的第四方法对象。其中,第四方法没有参数,上述第四类数组中的元素为空。
例如,第四方法为cardPowerDown方法,第四类数组中的元素为空,第一程序将“cardPowerDown”和{}作为参数,调用第四类对象cls4中的getDeclaredMethod方法,获取与cardPowerDown方法对应的第四方法对象handMethod4。
步骤275,第一程序根据第四方法对象,设置第四方法的访问控制权限。
具体地,第一程序可以通过调用第四方法对象中的setAccessible方法,设置第四方法的访问控制权限。
本实施例中,第一程序可以将布尔型常数“true”作为参数,调用第四方法对象handMethod4中的setAccessible方法,将第四方法的访问控制权限设置为跳过访问检查。
步骤276,第一程序根据第四类对象创建第四对象实例。
具体地,第一程序可以通过调用第四类对象中的newInstance方法,创建第四对象实例。
例如,第一程序调用第四类对象cls4中的newInstance方法,创建第四对象实例obj4。
步骤277,第一程序根据第四对象实例和第四方法对象,将第四方法的名称发送给第二程序。
具体地,第一程序可以生成第四对象数组,将第四对象实例和第四对象数组作为参数,调用第四方法对象中的invoke方法,将第四方法的名称发送给第二程序。其中,第四对象数组中的元素为空。
例如,第四对象实例为obj4,第四方法对象为handMethod4,第四方法为cardPowerDown方法,第四对象数组中的元素为空,第一程序将obj4和{}作为参数,调用handMethod4中的invoke方法,将第四方法的名称“cardPowerDown”发送给第二程序。
步骤278,第二程序根据外围设备中的卡片的类型生成下电指令,并根据接口实例信息向外围设备发送该下电指令。
具体地,第二程序根据外围设备中的卡片的类型,调用PackData类中的packPowerOffData方法,生成下电指令,并将下电指令作为参数,调用接口实例信息中的transmitApdu方法,将下电指令发送给外围设备。
步骤279,第二程序判断下电指令是否发送成功,如果是,则执行步骤281;否则,执行步骤280。
具体地,第二程序可以判断transmitApdu方法的返回值是否为第十八预设值,如果是,则确定下电指令发送成功;否则,确定下电指令发送未成功。其中,第十八预设值可以为0。
步骤280,第二程序向第一程序发送下电失败消息,第一程序显示下电失败信息,并返回步骤201。
例如,第二程序向第一程序返回“false”,第一程序显示“下电失败”。
步骤281,第二程序获取外围设备中的卡片返回给外围设备的响应码。
步骤282,第二程序根据获取到的响应码,判断外围设备中的卡片是否下电成功,如果是,则执行步骤283;否则,返回步骤280。
具体地,第二程序可以对获取到的响应码的取值进行判断,如果是第十九预设值,则确定外围设备中的卡片下电成功;否则,确定外围设备中的卡片下电未成功。其中,第十九预设值可以是“00”。
步骤283,第二程序向第一程序发送下电成功消息,第一程序显示下电成功信息,并返回步骤201。
例如,第二程序向第一程序返回“true”,第一程序显示“下电成功”。
本发明实施例提供的技术方案中,终端设备中的第一程序根据终端设备中的第二程序的包名创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,通过反射机制实现对第二程序中的第一方法、第二方法、第三方法和第四方法的调用,实现了与外围设备建立连接、对外围设备中的卡片上电、向外围设备中的卡片发指令,以及对外围设备中的卡片下电的功能,进而实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
基于上述通过方法调用实现与外围设备交互的方法,本发明实施例还提供了一种通过Android系统中的方法调用实现与外围设备交互的终端设备,如图7所示,该终端设备采用Android系统,并安装有第一程序700和第二程序800;
其中,第一程序700包括:
第一创建模块701,用于根据第二程序800的包名,创建第二程序800的上下文;
具体地,上述第一创建模块701,具体用于将第二程序800的包名和预设标记值作为参数,调用createPackageContext方法,得到第二程序800的上下文;
生成模块702,用于根据第一创建模块701创建的第二程序800的上下文生成类加载器;
具体地,上述生成模块702,具体用于调用第二程序800的上下文中的getClassLoader方法,得到类加载器;
加载模块703,用于根据生成模块702生成的类加载器、第二程序800中的功能方法的包名和类名,将功能方法所属的类加载到第一程序700的进程中,得到与功能方法对应的类对象;
具体地,上述加载模块703,具体用于将第二程序800中的功能方法的包名和类名作为参数,调用类加载器中的loadClass方法,将功能方法所属的类加载到第一程序700的进程中,得到与功能方法对应的类对象;
第一获取模块704,用于根据加载模块703得到的类对象和功能方法的名称,获取与功能方法对应的方法对象;
具体地,上述第一获取模块704,具体用于将功能方法的名称作为参数,调用类对象中的getDeclaredMethod方法,获取与功能方法对应的方法对象;
第一设置模块705,用于根据第一获取模块704获取到的方法对象设置功能方法的访问控制权限;
具体地,上述第一设置模块705,具体用于通过调用方法对象中的setAccessible方法,设置功能方法的访问控制权限;
第二创建模块706,用于根据加载模块703得到的类对象创建对象实例;
具体地,上述第二创建模块706,具体用于通过调用类对象中的newInstance方法,创建对象实例;
第一发送模块707,用于根据第二创建模块706创建的对象实例以及第一获取模块704获取到的与功能方法对应的方法对象,将功能方法的名称发送给第二程序800;
具体地,上述第一发送模块707,具体用于将对象实例作为参数,调用与功能方法对应的方法对象中的invoke方法,将功能方法的名称和实际参数发送给第二程序800;
第一接收模块708,用于接收第二程序800返回的执行成功消息或执行失败消息;
显示模块709,用于在第一接收模块708接收到执行成功消息时,显示交互成功信息;在第一接收模块708接收到执行失败消息时,显示交互失败信息;
第二程序800包括:
第二发送模块801,用于通过调用功能方法,向外围设备发送相应的功能指令;
第一判断模块802,用于判断第二发送模块801是否发送功能指令成功;
第三发送模块803,用于在第一判断模块802判断出功能指令发送成功时,向第一程序700返回执行成功消息;在第一判断模块802判断出功能指令未发送成功时,向第一程序700返回执行失败消息。
本实施例中,上述第一获取模块704,具体用于根据加载模块703得到的类对象、功能方法的名称和形参类型,获取与功能方法对应的方法对象;
具体地,上述第一获取模块704,具体用于根据功能方法的形参类型生成类数组,将功能方法的名称和类数组作为参数,调用类对象中的getDeclaredMethod方法,获取与功能方法对应的方法对象;
相应地,上述第一发送模块707,具体用于根据第二创建模块706创建的对象实例以及第一获取模块704获取到的与功能方法对应的方法对象,将功能方法的名称和实际参数发送给第二程序800;
具体地,上述第一发送模块707,具体用于根据功能方法的实际参数生成对象数组,将对象实例和对象数组作为参数,调用与功能方法对应的方法对象中的invoke方法,将功能方法的名称和实际参数发送给第二程序800。
上述第二发送模块801,具体用于根据功能方法的实际参数,通过调用功能方法,向外围设备发送相应的功能指令。
其中,上述功能方法可以为第一方法,相应地,类加载器为第一类加载器,类对象为第一类对象,第一方法的实际参数为第一程序700的上下文和外围设备连接状态信息,功能指令为握手指令,执行成功消息为握手成功消息,交互成功信息为握手成功信息,执行失败消息为握手失败消息,交互失败信息为握手失败信息;
相应地,上述第一获取模块704,具体用于根据第一类对象、第一方法的名称和形参类型,获取与第一方法对应的第一方法对象;
上述第二创建模块706,具体用于根据第一类对象创建第一对象实例;
上述第一发送模块707,具体用于根据第一对象实例和第一方法对象,将第一方法的名称、第一程序700的上下文和外围设备连接状态信息发送给第二程序800;
上述第二发送模块801,具体用于根据第一程序700的上下文和外围设备连接状态信息,通过调用第一方法,向外围设备发送握手指令。
上述第二程序800,还包括:
第二接收模块804,用于接收第一程序700的上下文和外围设备连接状态信息;
初始化模块805,用于将第二接收模块804接收到的第一程序700的上下文保存到本地,根据第一程序700的上下文加载动态库,对通讯库进行初始化;
第二判断模块806,用于判断第二接收模块804接收到的第一程序700的上下文是否为空;
第三判断模块807,用于在第二判断模块806判断出第一程序700的上下文不为空时,根据第二接收模块804接收到的外围设备连接状态信息判断外围设备是否已与终端设备连接上;
第二获取模块808,用于在第三判断模块807判断出外围设备已与终端设备连接上时,根据第一程序700的上下文获取接口实例信息;
第三发送模块803,还用于在第二判断模块806判断出第一程序700的上下文为空,或者第三判断模块807判断外围设备未与终端设备连接上时,向第一程序700返回握手失败消息。
进一步地,上述第二程序800,还包括:
第四判断模块809,用于获取外围设备返回的响应码,根据响应码判断是否执行成功;
第三发送模块803,还用于在第四判断模块809判断出执行成功时,向第一程序700返回执行成功消息;在第四判断模块809判断出未执行成功时,向第一程序700返回执行失败消息。
其中,上述功能方法还可以为第二方法,相应地,上述类加载器为第二类加载器,类对象为第二类对象,第二方法的实际参数为卡片类型信息,功能指令为上电指令,执行成功消息为上电成功消息,交互成功信息为上电成功信息,执行失败消息为上电失败消息,交互失败信息为上电失败信息;
上述第一获取模块704,具体用于根据第二类对象、第二方法的名称和形参类型,获取与第二方法对应的第二方法对象;
上述第二创建模块706,具体用于根据第二类对象创建第二对象实例;
上述第一发送模块707,具体用于根据第二对象实例和第二方法对象,将第二方法的名称和卡片类型信息发送给第二程序800;
上述第二发送模块801,具体用于根据卡片类型信息,通过调用第二方法,向外围设备发送上电指令;
上述第四判断模块809,具体用于获取外围设备中的卡片返回给外围设备的响应码,根据响应码判断外围设备中的卡片是否上电成功;
上述第三发送模块803,具体用于在第四判断模块809判断出上电成功时,向第一程序700返回上电成功消息;在第四判断模块809判断出未上电成功时,向第一程序700返回上电失败消息。
进一步地,上述第二程序800,还包括:
第二接收模块804,用于接收来自第一程序700的卡片类型信息;
第五判断模块810,用于根据第二接收模块804接收到的卡片类型信息,对外围设备中的卡片的类型进行判断;
上述第二发送模块801,还用于在第五判断模块810判断出卡片的类型为接触卡时,向外围设备发送第一寻卡指令;在第五判断模块810判断出卡片的类型为非接触卡时,向外围设备发送第二寻卡指令;
上述第一判断模块802,还用于判断第二发送模块801是否发送第一寻卡指令和第二寻卡指令成功;
上述第三发送模块803,还用于在第一判断模块802判断出第一寻卡指令或第二寻卡指令发送失败时,向第一程序700发送上电失败消息;
上述第二程序800,还包括:
第二设置模块811,用于在第一判断模块802判断出第一寻卡指令发送成功时,将外围设备中的卡片的类型设置为接触卡,生成上电指令,并触发第二发送模块801发送上电指令;在第一判断模块802判断出第二寻卡指令发送成功时,将外围设备中的卡片的类型设置为非接触卡,生成上电指令,并触发第二发送模块801发送上电指令。
进一步地,上述第二发送模块801,还用于在第五判断模块810判断出卡片的类型为未知时,向外围设备发送第一寻卡指令;在第一判断模块802判断出第一寻卡指令发送失败时,向外围设备发送第二寻卡指令。
其中,上述功能方法还可以为第三方法,相应地,类加载器为第三类加载器,类对象为第三类对象,第三方法的实际参数为指令数据的存储区、指令数据的长度和接收数据的存储区,功能指令为命令集,执行成功消息为响应数据的长度,交互成功信息为发指令成功信息,执行失败消息为错误码,交互失败信息为发指令失败信息;
相应地,第一获取模块704,具体用于根据第三类对象、第三方法的名称和形参类型,获取与第三方法对应的第三方法对象;
上述第二创建模块706,具体用于根据第三类对象创建第三对象实例;
上述第一发送模块707,具体用于根据第三对象实例和第三方法对象,将第三方法的名称、指令数据的存储区、指令数据的长度和接收数据的存储区发送给第二程序800;
上述第二发送模块801,具体用于根据指令数据的存储区、指令数据的长度和接收数据的存储区,通过调用第三方法,向外围设备发送命令集;
上述第四判断模块809,具体用于获取外围设备中的卡片返回给外围设备的响应码,根据响应码判断是否向外围设备中的卡片发送指令成功;
上述第三发送模块803,具体用于在第四判断模块809判断出发送指令成功时,向第一程序700返回执行成功消息;在第四判断模块809判断出发送指令失败时,向第一程序700返回执行失败消息。
进一步地,上述第二程序800,还包括:
第二接收模块804,用于接收指令数据的存储区、指令数据的长度和接收数据的存储区;
转换模块812,用于根据第二接收模块804接收到的指令数据的存储区和指令数据的长度获取指令数据,并对指令数据进行格式转换,得到命令字符串;
组织模块813,用于根据转换模块812转换得到的命令字符串和外围设备中的卡片的类型组织命令集;
第二发送模块801,具体用于通过调用第三方法,向外围设备发送组织模块813组织的命令集。
进一步地,上述第二程序800,还包括:
第六判断模块814,用于在第四判断模块809判断出向外围设备中的卡片发送指令成功后,判断外围设备中的卡片返回给外围设备的指令响应的长度是否大于第一预设长度;
处理模块815,用于在第六判断模块814判断出指令响应的长度大于第一预设长度时,将位于指令响应末尾、长度为第二预设长度的数据丢弃,并对指令响应进行格式转换,将转换得到的响应数据存储到接收数据的存储区中,并将响应数据的长度返回给第一程序700;在第六判断模块814判断出指令响应的长度不大于第一预设长度时,对指令响应进行格式转换,将转换得到的响应数据存储到接收数据的存储区中,并将响应数据的长度返回给第一程序700;
相应地,上述第一接收模块708,还用于接收响应数据的长度;
上述第一程序700,还包括:
第七判断模块710,用于判断第一接收模块708接收到的响应数据的长度是否大于零;
读取模块711,用于在第七判断模块710判断出响应数据的长度大于零时,根据响应数据的长度,从接收数据的存储区中读取响应数据;
显示模块709,还用于在第七判断模块710判断出响应数据的长度不大于零时,显示发指令失败信息。
进一步地,上述第二程序800,还包括:
第四判断模块809,用于获取外围设备返回的响应码,根据响应码判断是否执行成功;
上述第三发送模块803,还用于在第四判断模块809判断出执行成功时,向第一程序700返回执行成功消息;在第四判断模块809判断出未执行成功时,向第一程序700返回执行失败消息。
其中,上述功能方法还可以为第四方法,相应地,类加载器为第四类加载器,类对象为第四类对象,功能指令为下电指令,执行成功消息为下电成功消息,交互成功信息为下电成功信息,执行失败消息为下电失败消息,交互失败信息为下电失败信息;
相应地,上述第一获取模块704,具体用于根据第四类对象和第四方法的名称,获取与第四方法对应的第四方法对象;
上述第二创建模块706,具体用于根据第四类对象创建第四对象实例;
上述第一发送模块707,具体用于根据第四对象实例和第四方法对象,将第四方法的名称发送给第二程序800;
上述第二发送模块801,具体用于通过调用第四方法,向外围设备发送下电指令;
上述第四判断模块809,具体用于获取外围设备返回的响应码,根据响应码判断外围设备中的卡片是否下电成功。
本发明实施例提供的技术方案中,终端设备中的第一程序根据终端设备中的第二程序的包名创建第二程序的上下文,根据该上下文将第二程序中的方法所属的类加载到自身的进程中,通过反射机制实现对第二程序中的第一方法、第二方法、第三方法和第四方法的调用,实现了与外围设备建立连接、对外围设备中的卡片上电、向外围设备中的卡片发指令,以及对外围设备中的卡片下电的功能,进而实现了程序之间的资源共享,减少了对内存资源的占用,提高了程序的设备兼容性。
结合本文中所公开的实施例描述的方法中的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (30)
1.一种通过Android系统中的方法调用实现与外围设备交互的方法,其特征在于,应用于包括终端设备和外围设备的系统中,所述终端设备包括第一程序和第二程序,所述方法包括以下步骤:
S1、所述第一程序根据所述第二程序的包名,创建所述第二程序的上下文;
S2、所述第一程序根据所述第二程序的上下文生成类加载器,并根据所述类加载器、所述第二程序中的功能方法的包名和类名,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能方法对应的类对象;
S3、所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法对应的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限;
S4、所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述功能方法对应的方法对象,将所述功能方法的名称发送给所述第二程序;
S5、所述第二程序通过调用所述功能方法,向所述外围设备发送相应的功能指令;
S6、所述第二程序判断所述功能指令是否发送成功,如果是,则执行步骤S7;否则,执行步骤S9;
S7、所述第二程序向所述第一程序返回执行成功消息;
S8、所述第一程序显示交互成功信息,结束流程;
S9、所述第二程序向所述第一程序返回执行失败消息;
S10、所述第一程序显示交互失败信息,结束流程。
2.如权利要求1所述的方法,其特征在于,所述步骤S3,具体为:
所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方法对应的方法对象,并根据所述方法对象设置所述功能方法的访问控制权限;
所述步骤S4,具体为:
所述第一程序根据所述类对象创建对象实例,根据所述对象实例以及与所述功能方法对应的方法对象,将所述功能方法的名称和实际参数发送给所述第二程序;
所述步骤S5,具体为:
所述第二程序根据所述功能方法的实际参数,通过调用所述功能方法,向所述外围设备发送相应的功能指令。
3.如权利要求2所述的方法,其特征在于,所述功能方法为第一方法,所述类加载器为第一类加载器,所述类对象为第一类对象,所述第一方法的实际参数为所述第一程序的上下文和外围设备连接状态信息,所述功能指令为握手指令,所述执行成功消息为握手成功消息,所述交互成功信息为握手成功信息,所述执行失败消息为握手失败消息,所述交互失败信息为握手失败信息;
所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方法对应的方法对象,具体为:
所述第一程序根据所述第一类对象、所述第一方法的名称和形参类型,获取与所述第一方法对应的第一方法对象;
所述步骤S4,具体为:
所述第一程序根据所述第一类对象创建第一对象实例,根据所述第一对象实例和所述第一方法对象,将所述第一方法的名称、所述第一程序的上下文和所述外围设备连接状态信息发送给所述第二程序;
所述步骤S5,具体为:
所述第二程序根据所述第一程序的上下文和所述外围设备连接状态信息,通过调用所述第一方法,向所述外围设备发送所述握手指令。
4.如权利要求3所述的方法,其特征在于,所述步骤S5之前,还包括:
S11、所述第二程序将所述第一程序的上下文保存到本地,根据所述第一程序的上下文加载动态库,对通讯库进行初始化;
S12、所述第二程序判断所述第一程序的上下文是否为空,如果是,则执行步骤S13;否则,执行步骤S14;
S13、所述第二程序向所述第一程序返回所述握手失败消息,所述第一程序显示所述握手失败信息;
S14、所述第二程序根据所述外围设备连接状态信息判断所述外围设备是否已与所述终端设备连接上,如果是,则执行步骤S15;否则,返回步骤S13;
S15、所述第二程序根据所述第一程序的上下文获取接口实例信息,并执行步骤S5。
5.如权利要求2所述的方法,其特征在于,所述步骤S7之前,还包括:
S16、所述第二程序获取所述外围设备返回的响应码,根据所述响应码判断是否执行成功,如果是,则执行步骤S7;否则,执行步骤S9。
6.如权利要求5所述的方法,其特征在于,所述功能方法为第二方法,所述类加载器为第二类加载器,所述类对象为第二类对象,所述第二方法的实际参数为卡片类型信息,所述功能指令为上电指令,所述执行成功消息为上电成功消息,所述交互成功信息为上电成功信息,所述执行失败消息为上电失败消息,所述交互失败信息为上电失败信息;
所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方法对应的方法对象,具体为:
所述第一程序根据所述第二类对象、所述第二方法的名称和形参类型,获取与所述第二方法对应的第二方法对象;
所述步骤S4,具体为:
所述第一程序根据所述第二类对象创建第二对象实例,根据所述第二对象实例和所述第二方法对象,将所述第二方法的名称和所述卡片类型信息发送给所述第二程序;
所述步骤S5,具体为:
所述第二程序根据所述卡片类型信息,通过调用所述第二方法,向所述外围设备发送所述上电指令;
所述步骤S16,具体为:
所述第二程序获取所述外围设备中的卡片返回给所述外围设备的响应码,根据所述响应码判断所述外围设备中的卡片是否上电成功,如果是,则执行步骤S7;否则,执行步骤S9。
7.如权利要求6所述的方法,其特征在于,所述步骤S5之前,还包括:
S17、所述第二程序根据所述卡片类型信息,对所述外围设备中的卡片的类型进行判断,如果是接触卡,则执行步骤S18;如果是非接触卡,则执行步骤S22;
S18、所述第二程序向所述外围设备发送第一寻卡指令;
S19、所述第二程序判断所述第一寻卡指令是否发送成功,如果是,则执行步骤S21;否则,执行步骤S20;
S20、所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上电失败信息;
S21、所述第二程序将所述外围设备中的卡片的类型设置为接触卡,生成所述上电指令,并执行步骤S5;
S22、所述第二程序向所述外围设备发送第二寻卡指令;
S23、所述第二程序判断所述第二寻卡指令是否发送成功,如果是,则执行步骤S25;否则,执行步骤S24;
S24、所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上电失败信息;
S25、所述第二程序将所述外围设备中的卡片的类型设置为非接触卡,生成所述上电指令,并执行步骤S5。
8.如权利要求7所述的方法,其特征在于,所述第二程序根据所述卡片类型信息,判断出所述外围设备中的卡片的类型为未知之后,还包括以下步骤:
S26、所述第二程序向所述外围设备发送第一寻卡指令;
S27、所述第二程序判断所述第一寻卡指令是否发送成功,如果是,则执行步骤S28;否则,执行步骤S29;
S28、所述第二程序将所述外围设备中的卡片的类型设置为接触卡,生成所述上电指令,并执行步骤S5;
S29、所述第二程序向所述外围设备发送第二寻卡指令;
S30、所述第二程序判断所述第二寻卡指令是否发送成功,如果是,则执行步骤S32;否则,执行步骤S31;
S31、所述第二程序向所述第一程序发送所述上电失败消息,所述第一程序显示所述上电失败信息;
S32、所述第二程序将所述外围设备中的卡片的类型设置为非接触卡,生成所述上电指令,并执行步骤S5。
9.如权利要求5所述的方法,其特征在于,所述功能方法为第三方法,所述类加载器为第三类加载器,所述类对象为第三类对象,所述第三方法的实际参数为指令数据的存储区、指令数据的长度和接收数据的存储区,所述功能指令为命令集,所述执行成功消息为响应数据的长度,所述交互成功信息为发指令成功信息,所述执行失败消息为错误码,所述交互失败信息为发指令失败信息;
所述第一程序根据所述类对象、所述功能方法的名称和形参类型,获取与所述功能方法对应的方法对象,具体为:
所述第一程序根据所述第三类对象、所述第三方法的名称和形参类型,获取与所述第三方法对应的第三方法对象;
所述步骤S4,具体为:
所述第一程序根据所述第三类对象创建第三对象实例,根据所述第三对象实例和所述第三方法对象,将所述第三方法的名称、所述指令数据的存储区、所述指令数据的长度和所述接收数据的存储区发送给所述第二程序;
所述步骤S5,具体为:
所述第二程序根据所述指令数据的存储区、所述指令数据的长度和所述接收数据的存储区,通过调用所述第三方法,向所述外围设备发送所述命令集;
所述步骤S16,具体为:
所述第二程序获取所述外围设备中的卡片返回给所述外围设备的响应码,根据所述响应码判断是否向所述外围设备中的卡片发送指令成功,如果是,则执行步骤S7;否则,执行步骤S9。
10.如权利要求9所述的方法,其特征在于,所述步骤S5之前,还包括:
所述第二程序根据所述指令数据的存储区和所述指令数据的长度获取指令数据,并对所述指令数据进行格式转换,得到命令字符串;
所述第二程序根据所述命令字符串和所述外围设备中的卡片的类型组织所述命令集。
11.如权利要求9所述的方法,其特征在于,所述第二程序根据所述响应码判断出向所述外围设备中的卡片发送指令成功之后,还包括:
S33、所述第二程序判断所述外围设备中的卡片返回给所述外围设备的指令响应的长度是否大于第一预设长度,如果是,则执行步骤S34;否则,执行步骤S35;
S34、所述第二程序将位于所述指令响应末尾、长度为第二预设长度的数据丢弃,并执行步骤S35;
S35、所述第二程序对所述指令响应进行格式转换,将转换得到的响应数据存储到所述接收数据的存储区中,并将所述响应数据的长度返回给所述第一程序;
S36、所述第一程序判断所述响应数据的长度是否大于零,如果是,则执行步骤S38;否则,执行步骤S37;
S37、所述第一程序显示所述发指令失败信息;
S38、所述第一程序根据所述响应数据的长度,从所述接收数据的存储区中读取所述响应数据。
12.如权利要求1所述的方法,其特征在于,所述步骤S7之前,还包括:
所述第二程序获取所述外围设备返回的响应码,根据所述响应码判断是否执行成功,如果是,则执行步骤S7;否则,执行步骤S9。
13.如权利要求12所述的方法,其特征在于,所述功能方法为第四方法,所述类加载器为第四类加载器,所述类对象为第四类对象,所述功能指令为下电指令,所述执行成功消息为下电成功消息,所述交互成功信息为下电成功信息,所述执行失败消息为下电失败消息,所述交互失败信息为下电失败信息;
所述第一程序根据所述类对象和所述功能方法的名称,获取与所述功能方法对应的方法对象,具体为:
所述第一程序根据所述第四类对象和所述第四方法的名称,获取与所述第四方法对应的第四方法对象;
所述步骤S4,具体为:
所述第一程序根据所述第四类对象创建第四对象实例,根据所述第四对象实例和所述第四方法对象,将所述第四方法的名称发送给所述第二程序;
所述步骤S5,具体为:
所述第二程序通过调用所述第四方法,向所述外围设备发送所述下电指令;
所述第二程序根据所述响应码判断是否执行成功,具体为:
所述第二程序根据所述响应码判断所述外围设备中的卡片是否下电成功。
14.如权利要求1所述的方法,其特征在于,所述步骤S1,具体包括:
所述第一程序将所述第二程序的包名和预设标记值作为参数,调用createPackageContext方法,得到所述第二程序的上下文;
所述步骤S2,具体包括:
所述第一程序调用所述第二程序的上下文中的getClassLoader方法,得到所述类加载器,并将所述第二程序中的功能方法的包名和类名作为参数,调用所述类加载器中的loadClass方法,将所述功能方法所属的类加载到所述第一程序的进程中,得到与所述功能方法对应的类对象;
所述步骤S3,具体包括:
所述第一程序将所述功能方法的名称作为参数,调用所述类对象中的getDeclaredMethod方法,获取与所述功能方法对应的方法对象,并通过调用所述方法对象中的setAccessible方法,设置所述功能方法的访问控制权限;
所述步骤S4,具体包括:
所述第一程序通过调用所述类对象中的newInstance方法,创建对象实例,将所述对象实例作为参数,调用与所述功能方法对应的方法对象中的invoke方法,将所述功能方法的名称和实际参数发送给所述第二程序。
15.如权利要求2所述的方法,其特征在于,所述步骤S3,具体包括:
所述第一程序根据所述功能方法的形参类型生成类数组,将所述功能方法的名称和所述类数组作为参数,调用所述类对象中的getDeclaredMethod方法,获取与所述功能方法对应的方法对象,并通过调用所述方法对象中的setAccessible方法,设置所述功能方法的访问控制权限;
所述步骤S4,具体包括:
所述第一程序通过调用所述类对象中的newInstance方法,创建对象实例,根据所述功能方法的实际参数生成对象数组,将所述对象实例和所述对象数组作为参数,调用与所述功能方法对应的方法对象中的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方法,设置所述功能方法的访问控制权限;
所述第二创建模块,具体用于通过调用所述类对象中的newInstance方法,创建对象实例;
所述第一发送模块,具体用于将所述对象实例作为参数,调用与所述功能方法对应的方法对象中的invoke方法,将所述功能方法的名称和实际参数发送给所述第二程序。
30.如权利要求17所述的终端设备,其特征在于,
所述第一获取模块,具体用于根据所述功能方法的形参类型生成类数组,将所述功能方法的名称和所述类数组作为参数,调用所述类对象中的getDeclaredMethod方法,获取与所述功能方法对应的方法对象;
所述第一发送模块,具体用于根据所述功能方法的实际参数生成对象数组,将所述对象实例和所述对象数组作为参数,调用与所述功能方法对应的方法对象中的invoke方法,将所述功能方法的名称和实际参数发送给所述第二程序。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410291252.4A CN104090654B (zh) | 2014-06-25 | 2014-06-25 | 一种通过方法调用实现与外围设备交互的方法和设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410291252.4A CN104090654B (zh) | 2014-06-25 | 2014-06-25 | 一种通过方法调用实现与外围设备交互的方法和设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104090654A true CN104090654A (zh) | 2014-10-08 |
CN104090654B CN104090654B (zh) | 2017-06-06 |
Family
ID=51638375
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410291252.4A Active CN104090654B (zh) | 2014-06-25 | 2014-06-25 | 一种通过方法调用实现与外围设备交互的方法和设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104090654B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107015873A (zh) * | 2017-01-23 | 2017-08-04 | 阿里巴巴集团控股有限公司 | App的功能模块的调用方法、组件接口装置、电子设备及App |
CN107667343A (zh) * | 2015-06-05 | 2018-02-06 | 苹果公司 | 按需加载资源 |
CN111625379A (zh) * | 2020-06-02 | 2020-09-04 | 网易(杭州)网络有限公司 | 一种信息处理的方法、装置、电子设备和可读存储介质 |
US11818224B2 (en) | 2015-06-05 | 2023-11-14 | Apple Inc. | On demand resources |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005036850A1 (fr) * | 2003-09-30 | 2005-04-21 | France Telecom | Dispositif fournisseur de service a interface vocale pour terminaux de telecommunication, et procede de fourniture de service correspondant |
CN102591724A (zh) * | 2011-12-28 | 2012-07-18 | 奇智软件(北京)有限公司 | 消息交互方法及装置 |
CN103324542A (zh) * | 2013-07-17 | 2013-09-25 | 天脉聚源(北京)传媒科技有限公司 | 一种模块间调用的方法及装置 |
-
2014
- 2014-06-25 CN CN201410291252.4A patent/CN104090654B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005036850A1 (fr) * | 2003-09-30 | 2005-04-21 | France Telecom | Dispositif fournisseur de service a interface vocale pour terminaux de telecommunication, et procede de fourniture de service correspondant |
CN102591724A (zh) * | 2011-12-28 | 2012-07-18 | 奇智软件(北京)有限公司 | 消息交互方法及装置 |
CN103324542A (zh) * | 2013-07-17 | 2013-09-25 | 天脉聚源(北京)传媒科技有限公司 | 一种模块间调用的方法及装置 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107667343A (zh) * | 2015-06-05 | 2018-02-06 | 苹果公司 | 按需加载资源 |
CN107667343B (zh) * | 2015-06-05 | 2021-04-16 | 苹果公司 | 用于加载按需加载资源的系统和方法 |
US11818224B2 (en) | 2015-06-05 | 2023-11-14 | Apple Inc. | On demand resources |
CN107015873A (zh) * | 2017-01-23 | 2017-08-04 | 阿里巴巴集团控股有限公司 | App的功能模块的调用方法、组件接口装置、电子设备及App |
CN111625379A (zh) * | 2020-06-02 | 2020-09-04 | 网易(杭州)网络有限公司 | 一种信息处理的方法、装置、电子设备和可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104090654B (zh) | 2017-06-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107370804B (zh) | 软件应用处理方法和装置 | |
CN111552274B (zh) | 汽车诊断方法、装置、设备、系统和诊断连接设备 | |
CN109587252A (zh) | 运营商参数的加载方法、装置、电子设备及存储介质 | |
CN103316472A (zh) | 一种基于蓝牙手柄的Android设备游戏平台系统及其实现方法 | |
CN104090654A (zh) | 一种通过方法调用实现与外围设备交互的方法和设备 | |
CN102915113A (zh) | 一种数据输入支持方法及装置 | |
CN106406944A (zh) | 一种禁止应用自启动的控制方法及系统 | |
CN110167192B (zh) | 蓝牙连接管理方法及装置、电子设备和非暂态存储介质 | |
CN101931603A (zh) | 一种在手持智能终端上实现远程调用的方法 | |
CN109150956A (zh) | 一种推送sdk的实现方法、装置、设备和计算机存储介质 | |
CN106203184A (zh) | 一种键盘输出方法及终端 | |
CN115017534B (zh) | 文件处理权限控制方法、装置及存储介质 | |
CN103793644A (zh) | 信息安全设备实现多应用的方法、信息安全设备和系统 | |
CN111813625A (zh) | 分布式服务器集群的健康检查方法及装置 | |
CN111371695A (zh) | 服务限流方法及装置 | |
CN107092507A (zh) | 应用程序的换肤方法、装置及系统 | |
CN208188814U (zh) | 一种嵌入式设备及其远程升级系统 | |
CN104570967B (zh) | 基于Android系统的远程控制方法及系统 | |
CN103365672A (zh) | 一种处理应用程序的描述信息的方法和系统 | |
CN108650594A (zh) | 一种音箱管理方法及用户终端、计算机存储介质 | |
CN110177360B (zh) | 一种用于与可穿戴设备绑定的方法与设备 | |
CN105138373A (zh) | 汽车诊断设备固件升级方法及装置 | |
CN213069764U (zh) | 一种触控设备 | |
CN106161750A (zh) | 一种信息处理方法及电子设备 | |
CN111711940A (zh) | 一种智能设备数据交互方法、智能设备和存储装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |