CN106502668B - 一种实现Android JNI反射的接口封装方法及*** - Google Patents
一种实现Android JNI反射的接口封装方法及*** Download PDFInfo
- Publication number
- CN106502668B CN106502668B CN201610914753.2A CN201610914753A CN106502668B CN 106502668 B CN106502668 B CN 106502668B CN 201610914753 A CN201610914753 A CN 201610914753A CN 106502668 B CN106502668 B CN 106502668B
- Authority
- CN
- China
- Prior art keywords
- class
- function
- module
- interface
- packaged
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种实现Android JNI反射的接口封装方法及***,涉及Android***的JNI开发技术领域。该方法包括:先完成Reflect模块的功能设置并封装成相应功能接口,以供后续Native层的Field模块、Method模块、Class模块调用;再完成Native层Field模块和Method模块的功能设置并封装成相应功能接口;最后,完成Native层Class模块的功能设置并封装成相应功能接口。本发明的接口封装方法通过反射Java层的对应反射函数来获取对应的Java层的类、对象以及函数,并对其进行封装,保证了Native层与Java层具有相同的调用方式,提供更加简洁化的接口,便于调试,解决了Native原生反射的各种问题。
Description
技术领域
本发明涉及Android***的JNI(Java Native Interface,Java本地接口)开发技术领域,具体来讲是一种实现Android JNI反射的接口封装方法及***。
背景技术
JNI(Java本地接口)是一个编程框架,使得运行在Java虚拟机上的Java程序调用或者被调用特定于本机硬件与操作***的用其它语言(C、C++或汇编语言等)编写的程序。
目前,在Android JNI的开发过程中,经常会用Native层(本地语言层,因为Android***是基于linux内核,因此这里Native层表示C/C++语言)与Java层的代码以及函数进行通讯,而Native层调用、获取Java层的对象或者函数均需要通过反射获取(在计算机科学中,反射是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力,也就是说,具有反射的程序能够“观察”并且修改自己的行为)。但实际操作中,Native原生反射具有如下缺点:
1.调用复杂,代码量偏多,并且有的大量的重复代码;
2.接口编写困难,需要针对每个不同的函数编写其函数签名,而函数签名非常容易编写错误;
3.难于调试,没办法直接定位问题。
因此,如何在Android JNI的开发过程中设计出有效的方法来克服Native原生反射的种种问题,是本领域技术人员亟待解决的问题。
发明内容
本发明的目的是为了克服上述背景技术的不足,提供一种实现Android JNI反射的接口封装方法及***,保证了Native层与Java层具有相同的调用方式,提供更加简洁化的接口,便于调试,解决了Native原生反射的各种问题。
为达到以上目的,本发明采取的技术方案是:提供一种实现Android JNI反射的接口封装方法,包括以下步骤:
A、完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层的Field模块、Method模块、Class模块与Java层的对应组件进行绑定,所述Reflect模块的功能接口包括成员获取函数接口和方法获取函数接口;
B、完成Native层Field模块的功能设置并封装成相应功能接口,所述Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,所述Field模块的功能接口包括成员对象值获取函数接口、成员对象获取函数接口、成员对象值设置函数接口和成员对象设置函数接口;
完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口;
C、完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口、字符串名称获取接口、Field对象获取接口和Method对象获取接口。
本发明还提供一种实现Android JNI反射的接口封装***,该***包括Reflect模块封装单元、Field模块封装单元、Method模块封装单元和Class模块封装单元。
其中,所述Reflect模块封装单元用于:完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层的Field模块、Method模块、Class模块与Java层的对应组件进行绑定,所述Reflect模块的功能接口包括成员获取函数接口和方法获取函数接口。所述Field模块封装单元用于:完成Native层Field模块的功能设置并封装成相应功能接口,所述Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,所述Field模块的功能接口包括成员对象值获取函数接口、成员对象获取函数接口、成员对象值设置函数接口和成员对象设置函数接口。所述Method模块封装单元用于:完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口。所述Class模块封装单元用于:完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口、字符串名称获取接口、Field对象获取接口和Method对象获取接口。
本发明的有益效果在于:
本发明的接口封装方法通过反射Java层的对应反射函数来获取对应的Java层的类、对象以及函数,并对其进行封装,避免了Native层获取Java方法时需要编写对应方法签名等一系列的复杂步骤,其接口封装高效简洁直观,能使开发人员快速进行与Java方法的通讯,大大的提高了开发效率。与现有技术的Native原生反射相比,本发明能与java层保持一致的调用方式,无需多余的学习成本;无需对每个函数编写其函数签名,可直接调用;简洁轻量,提供更加简洁化的接口,便于调试,解决了Native原生反射的各种问题。
附图说明
图1为本发明实施例中实现Android JNI反射的接口封装方法的流程图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步的详细描述。
由于在Java层中反射是通过Class,Method,Field等类实现的,因此,为了达到调用方式的一致,本发明的封装方法也是基于Class,Method和Field这三类来实现的。
参见图1所示,本发明实施例提供一种实现Android JNI反射的接口封装方法,包括以下步骤:
步骤S1:完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层完成封装的Field模块、Method模块、Class模块与Java层的对应组件进行绑定(其功能类似于映射,目的是为了屏蔽Native与Java反射之间的差异性),所述Reflect模块的功能接口包括成员获取函数接口getDeclaredFieldById()和方法获取函数接口getDeclarMethodForById(),两个功能接口可供Native层的Field模块、Method模块、Class模块调用。
可以理解的是,本实施例中,所述Java层的对应组件包括Field类、Method类和Class类。其中,Field类用于获取成员对象,Method类用于获取成员函数,Class类用来处理Native层获取Java层的类。在此基础上,步骤S1具体包括以下流程:
步骤S101:将JNI提供的jniEnv对象(JNI提供给开发者的一个Java环境对象)绑定到Reflect模块中,使Reflect模块在被调用时能通过此对象的函数与Java层进行交互。
可以理解的是,Native原生的反射功能就是通过jniEnv对象进行的,任何JNI程序都能直接获取jniEnv对象,比如通过JNI的初始化函数JNI_OnLoad获取。
步骤S102:为所述Java层的对应组件(即Java层的Field类、Method类和Class类)创建所有的方法签名,所有的方法签名均需要对照JNI函数签名规则进行编写,比如Java层的Method类的getName()函数,其函数签名就是“()Ljava/lang/String”;然后,通过一张Hash表(哈希表)将方法字符串名称作为键,方法签名作为值存储起来,以便后续查找。
可以理解的是,本实施例中,Hash表是根据键Key而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
步骤S103:将Reflect模块设置为通过jniEnv对象的FindClass函数(FindClass函数用于获取Java层的各种类)分别获取Java层的Field类、Method类和Class类,并封装成成员获取函数接口getDeclaredFieldById()和方法获取函数接口getDeclarMethodForById(),供后续Native层的Field模块、Method模块、Class模块调用。
具体来说,所述成员获取函数接口getDeclaredFieldById()是通过以下方式实现的:通过绑定的jniEnv调用其自身的回调函数CallObjectMethod,并将步骤S102中Hash表中存储的Java层的成员获取函数getDeclaredField的签名和成员字符串名称作为参数,得到的值就是真实的Field对象。其实现代码类似于下面内容:
除此之外,所述方法获取函数接口getDeclarMethodForById()是通过以下方式实现的:与成员获取函数接口getDeclaredFieldById()类似,将步骤S102中Hash表存储的Java层的方法获取函数getDeclar Method的签名和该函数字符串名称作为参数,通过调用jniEnv自身的回调函数CallObjectMethod,获取到对应的真实Method对象。
步骤S2:完成Native层Field模块的功能设置并封装成相应功能接口,所述Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,所述Field模块的功能接口包括成员对象值获取函数接口getInt()、成员对象获取函数接口getObject()、成员对象值设置函数接口setInt()和成员对象设置函数接口setOnject(),(比如一个Field类中有成员变量int count=3,通过Field模块的getInt()就能得到值3,同样的调用setInt(4),就能先将count值设为4)。
具体来说,步骤S2包括以下流程:
步骤S201:将Field模块设置为通过调用步骤S1中Reflect模块的成员获取函数接口getDeclaredFieldById()获取Java层Field类的具体对象(这里用mFiled代指具体对象)。
步骤S202:将Field模块设置为根据步骤S201获取的具体对象(mFiled)以及传入的Java对象,通过调用Reflect模块中jniEnv对象的回调函数CallTypeMethod(CallTypeMethod函数用于获取指定类型的成员,其中“type”指具体的类型,如果是getInt()接口就调用CallIntMethod,如果是getObject()接口就调用CallObjectMethod)来实现成员对象值或成员对象的获取,并相应封装成成员对象值获取函数接口getInt()和成员对象获取函数接口getObject();
将Field模块设置为根据步骤S201获取的具体对象以及传入的Java对象,通过调用Reflect模块中jniEnv对象的回调函数CallVoidMethod(CallVoidMethod函数接受指定的函数签名作为参数,来调用指定的Java函数,此处函数签名同样通过Reflect模块获取)来实现成员对象值或成员对象的设置,并相应封装成成员对象值设置函数接口setInt()和成员对象设置函数接口setOnject()。
步骤S3:完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口invoke。
具体来说,步骤S3包括以下流程:
步骤S301:将Method模块设置为根据传入的参数(将Java对象、需要获取的函数字符串名称,以及需要获取函数的指定的参数数组作为参数进行传入)调用步骤S1中Reflect模块的方法获取函数接口getDeclarMethodForById()来获取Java层Method类的具体对象(这里用mMethod代指具体对象)。
步骤S302:将Method模块设置为根据步骤S301获取的具体对象(mMethod)调用Java层Method类的访问设置函数setAccessible,将对应的函数设置成可访问。
步骤S303:将Method模块设置为先通过调用Reflect模块中jniEnv对象的对象数组创建函数NewObjectArray创建一个对象数组,再将传入的参数依次遍历到创建的对象数组中,并进行对象数组的初始化,然后通过调用Reflect模块中jniEnv对象的回调函数CallObjectMethod将初始化后的对象数组作为参数调用指定Java层Method类所表示的函数,以实现根据函数名的Java层函数调用,并相应封装成函数名调用接口invoke。
实际操作时,步骤S2和步骤S3可同时执行或根据实际情况进行先后顺序的调整,本实施例仅为一具体实例,并不是对其先后顺序的限制。
步骤S4:完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口forName()、字符串名称获取接口getName()、Field对象获取接口getField()和Method对象获取接口getMethod()。
具体来说,步骤S4包括以下流程:
将Class模块设置为直接通过Java层已有的Class.forName()函数调用,该函数将接收到的字符串描述的类名作为参数(比如要获取Java层的Class类,其全称是“java.lang.Class”,那么其字符串描述就是“Ljava/lang/Class”),并根据该参数获取对应的Class类的Java对象;并将上述设置封装成类名获取接口forName()。其中,Class.forName()函数的内部实现逻辑是:该函数内部实例化了一个Class对象(通过Class对象来进行字符串类名到实际的类的对象的转换),Class对象先将字符串类名转换成jni反射类名的格式,然后通过Reflect模块中jniEnv对象的FindClass函数(将转换好的参数传入)获得对应Class类的Java对象,之后再通过Reflect模块中jniEnv对象的NewGlobalRef函数将对象标记成全局引用(如果不标记全局引用,那么在一次使用后或被Java垃圾回收机回收,无法再次使用)。
将Class模块设置为通过Reflect模块中jniEnv对象的回调函数CallObjectMethod调用Java层Class类已有的getName函数,以获取当前到Java层Class类的字符串名称;然后通过jniEnv对象已有的GetStringUTFChars函数将获取的字符串的格式转换成utf-8格式,以保证编码正确,防止出现乱码;再将上述设置封装成字符串名称获取接口getName()。
将Class模块设置为将Java层Class类的字符串成员名(比如java层Class类有成员name,其字符串就是“name”)作为参数传入到封装好的Field模块中,利用封装好的Field模块来获取对应的Field对象;并将上述设置封装成Field对象获取接口getField()。
将Class模块设置为将Java层Class类的字符串函数名(比如java层Class类有函数getName(),其字符串函数名就是“getName”)作为参数传入到封装好的Method模块中,利用封装好的Method模块来获取对应的Method对象;并将上述设置封装成Method对象获取接口getMethod()。可以理解的是,实际操作时传入的参数可为固定参数也可为不定参数(不定参数也叫可变参数,指用其定义的函数参数个数不固定)。当为不定参数时,先将可变参数依次遍历放入到一个数组中存储起来并记录其大小,然后将字符串函数名、可变参数数组以及大小等数据传入到Method模块,通过Method模块来获取对应的Method对象。
进一步的,本发明在实际操作中为了防止封装的接口在任何项目中无歧义的良好使用,在执行步骤S1之前还需执行命名空间的设置操作。该命名空间(Namespac)表示标识符(identifier)的可见范围,一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的,这就使得在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中(比如一个项目中有多个模块,其中有些模块的某些变量或者函数都使用了同样的名称,在项目中为了区分这些功能引起的歧义,可以通过命名空间来区分)。本发明中,设置命名空间就是给整个封装接口添加一个指定的命名空间(如:NativeReflect)。
本发明实施例还提供一种实现Android JNI反射的接口封装***,包括Reflect模块封装单元、Field模块封装单元、Method模块封装单元和Class模块封装单元。
其中,Reflect模块封装单元用于:完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层的Field模块、Method模块、Class模块与Java层的对应组件进行绑定,所述Reflect模块的功能接口包括成员获取函数接口和方法获取函数接口。
Field模块封装单元用于:完成Native层Field模块的功能设置并封装成相应功能接口,Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,Field模块的功能接口包括成员对象值获取函数接口、成员对象获取函数接口、成员对象值设置函数接口和成员对象设置函数接口。
Method模块封装单元用于:完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口。
Class模块封装单元用于:完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口、字符串名称获取接口、Field对象获取接口和Method对象获取接口。
需要说明的是:上述实施例提供的***在进行操作时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将***的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (10)
1.一种实现Android JNI反射的接口封装方法,其特征在于,该方法包括以下步骤:
A、完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层的Field模块、Method模块、Class模块与Java层的对应组件进行绑定,所述Reflect模块的功能接口包括成员获取函数接口和方法获取函数接口,所述Java层的对应组件包括Field类、Method类和Class类;
B、完成Native层Field模块的功能设置并封装成相应功能接口,所述Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,所述Field模块的功能接口包括成员对象值获取函数接口、成员对象获取函数接口、成员对象值设置函数接口和成员对象设置函数接口;
完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口;
C、完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口、字符串名称获取接口、Field对象获取接口和Method对象获取接口。
2.如权利要求1所述的实现Android JNI反射的接口封装方法,其特征在于,
步骤A具体包括以下操作:
将JNI提供的jniEnv对象绑定到Reflect模块中,使Reflect模块在被调用时能通过此对象的函数与Java层进行交互;
为Java层的Field类、Method类和Class类创建方法签名,所述方法签名对照JNI函数签名规则进行创建,并通过Hash表进行存储;
将Reflect模块设置为通过jniEnv对象的FindClass函数分别获取Java层的Field类、Method类和Class类,并封装成成员获取函数接口和方法获取函数接口。
3.如权利要求2所述的实现Android JNI反射的接口封装方法,其特征在于:步骤B中所述完成Native层Field模块的功能设置并封装成相应功能接口,具体包括以下操作:
将Field模块设置为通过调用Reflect模块的成员获取函数接口获取Java层Field类的具体对象;
将Field模块设置为根据获取的Field类的具体对象以及传入的Java对象,通过调用Reflect模块中jniEnv对象的回调函数CallVoidMethod来实现成员对象值或成员对象的设置,并相应封装成成员对象值设置函数接口和成员对象设置函数接口。
4.如权利要求2所述的实现Android JNI反射的接口封装方法,其特征在于:步骤B中所述完成Native层Method模块的功能设置并封装成相应功能接口,具体包括以下操作:
将Method模块设置为通过调用Reflect模块的方法获取函数接口来获取Java层Method类的具体对象;
将Method模块设置为根据获取的Method类的具体对象调用Java层Method类的访问设置函数setAccessible,将对应的函数设置成可访问;
将Method模块设置为先通过调用Reflect模块中jniEnv对象的对象数组创建函数创建一个对象数组,再将传入的参数依次遍历到创建的对象数组中,并进行对象数组的初始化,然后通过调用Reflect模块中jniEnv对象的回调函数CallObjectMethod将初始化后的对象数组作为参数调用指定Java层Method类所表示的函数,以实现根据函数名的Java层函数调用,并相应封装成函数名调用接口。
5.如权利要求2所述的实现Android JNI反射的接口封装方法,其特征在于,步骤C具体包括以下操作:
将Class模块设置为直接通过Java层已有的Class.forName()函数调用,该函数将接收到的字符串描述的类名作为参数并根据该参数获取对应的Class类的Java对象;将上述设置封装成类名获取接口;
将Class模块设置为通过Reflect模块中jniEnv对象的回调函数CallObjectMethod调用Java层Class类已有的getName函数,以获取当前Java层Class类的字符串名称;通过jniEnv对象已有的GetStringUTFChars函数将获取的字符串名称的格式转换成utf-8格式;再将上述设置封装成字符串名称获取接口;
将Class模块设置为将Java层Class类的字符串成员名作为参数传入到封装好的Field模块中,利用封装好的Field模块来获取对应的Field对象;并将上述设置封装成Field对象获取接口;
将Class模块设置为将Java层Class类的字符串函数名作为参数传入到封装好的Method模块中,利用封装好的Method模块来获取对应的Method对象;并将上述设置封装成Method对象获取接口。
6.一种实现Android JNI反射的接口封装***,其特征在于:包括Reflect模块封装单元、Field模块封装单元、Method模块封装单元和Class模块封装单元;
所述Reflect模块封装单元用于:完成Reflect模块的功能设置并封装成相应功能接口,所述Reflect模块的功能包括将Native层的Field模块、Method模块、Class模块与Java层的对应组件进行绑定,所述Reflect模块的功能接口包括成员获取函数接口和方法获取函数接口,所述Java层的对应组件包括Field类、Method类和Class类;
所述Field模块封装单元用于:完成Native层Field模块的功能设置并封装成相应功能接口,所述Field模块的功能包括根据Java对象和需要获取的字符串成员名获取Java层Field类的成员对象的值和设置其值,所述Field模块的功能接口包括成员对象值获取函数接口、成员对象获取函数接口、成员对象值设置函数接口和成员对象设置函数接口;
所述Method模块封装单元用于:完成Native层Method模块的功能设置并封装成相应功能接口,所述Method模块的功能包括根据函数名调用Java层Method类所表示的函数,所述Method模块的功能接口包括函数名调用接口;
所述Class模块封装单元用于:完成Native层Class模块的功能设置并封装成相应功能接口,所述Class模块的功能包括根据类名获取对应Java层的Class类、通过调用Reflect模块获取当前Java层的Class类的字符串名称、根据Java层Class类的字符串成员名获取Field对象以及根据Java层Class类的字符串函数名获取Method对象,所述Class模块的功能接口包括类名获取接口、字符串名称获取接口、Field对象获取接口和Method对象获取接口。
7.如权利要求6所述的实现Android JNI反射的接口封装***,其特征在于:所述Reflect模块封装单元完成Reflect模块的功能设置并封装成相应功能接口的具体流程为:将JNI提供的jniEnv对象绑定到Reflect模块中,使Reflect模块在被调用时能通过此对象的函数与Java层进行交互;为Java层的Field类、Method类和Class类创建方法签名,所述方法签名对照JNI函数签名规则进行创建,并通过Hash表进行存储;将Reflect模块设置为通过jniEnv对象的FindClass函数分别获取Java层的Field类、Method类和Class类,并封装成成员获取函数接口和方法获取函数接口。
8.如权利要求7所述的实现Android JNI反射的接口封装***,其特征在于,所述Field模块封装单元完成Native层Field模块的功能设置并封装成相应功能接口的具体流程为:
将Field模块设置为通过调用Reflect模块的成员获取函数接口获取Java层Field类的具体对象;
将Field模块设置为根据获取的Field类的具体对象以及传入的Java对象,通过调用Reflect模块中jniEnv对象的回调函数CallVoidMethod来实现成员对象值或成员对象的设置,并相应封装成成员对象值设置函数接口和成员对象设置函数接口。
9.如权利要求7所述的实现Android JNI反射的接口封装***,其特征在于,所述Method模块封装单元完成Native层Method模块的功能设置并封装成相应功能接口的具体流程为:
将Method模块设置为通过调用Reflect模块的方法获取函数接口来获取Java层Method类的具体对象;
将Method模块设置为根据获取的Method类的具体对象调用Java层Method类的访问设置函数setAccessible,将对应的函数设置成可访问;
将Method模块设置为先通过调用Reflect模块中jniEnv对象的对象数组创建函数创建一个对象数组,再将传入的参数依次遍历到创建的对象数组中,并进行对象数组的初始化,然后通过调用Reflect模块中jniEnv对象的回调函数CallObjectMethod将初始化后的对象数组作为参数调用指定Java层Method类所表示的函数,以实现根据函数名的Java层函数调用,并相应封装成函数名调用接口。
10.如权利要求7所述的实现Android JNI反射的接口封装***,其特征在于,所述Class模块封装单元完成Native层Class模块的功能设置并封装成相应功能接口的具体流程为:
将Class模块设置为直接通过Java层已有的Class.forName()函数调用,该函数将接收到的字符串描述的类名作为参数并根据该参数获取对应的Class类的Java对象;将上述设置封装成类名获取接口;
将Class模块设置为通过Reflect模块中jniEnv对象的回调函数CallObjectMethod调用Java层Class类已有的getName函数,以获取当前Java层Class类的字符串名称;通过jniEnv对象已有的GetStringUTFChars函数将获取的字符串名称的格式转换成utf-8格式;再将上述设置封装成字符串名称获取接口;
将Class模块设置为将Java层Class类的字符串成员名作为参数传入到封装好的Field模块中,利用封装好的Field模块来获取对应的Field对象;并将上述设置封装成Field对象获取接口;
将Class模块设置为将Java层Class类的字符串函数名作为参数传入到封装好的Method模块中,利用封装好的Method模块来获取对应的Method对象;并将上述设置封装成Method对象获取接口。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610914753.2A CN106502668B (zh) | 2016-10-20 | 2016-10-20 | 一种实现Android JNI反射的接口封装方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610914753.2A CN106502668B (zh) | 2016-10-20 | 2016-10-20 | 一种实现Android JNI反射的接口封装方法及*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106502668A CN106502668A (zh) | 2017-03-15 |
CN106502668B true CN106502668B (zh) | 2019-08-23 |
Family
ID=58318702
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610914753.2A Active CN106502668B (zh) | 2016-10-20 | 2016-10-20 | 一种实现Android JNI反射的接口封装方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106502668B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108920179A (zh) * | 2017-04-12 | 2018-11-30 | ***通信集团福建有限公司 | Java反射实现方法、装置和*** |
CN107832056B (zh) * | 2017-12-14 | 2020-12-18 | 苏州蜗牛数字科技股份有限公司 | 基于jni的c++中java函数调用方法 |
CN109960666B (zh) * | 2017-12-22 | 2021-05-11 | 北京安天网络安全技术有限公司 | 反射与aidl获取并清理缓存方法及*** |
CN113835989A (zh) * | 2020-06-08 | 2021-12-24 | 武汉斗鱼鱼乐网络科技有限公司 | 一种性能统计方法和装置 |
CN111966427B (zh) * | 2020-08-17 | 2022-06-21 | 四川长虹电器股份有限公司 | 一种Android native调用Java API的实现方法 |
CN112134905B (zh) * | 2020-11-20 | 2021-02-09 | 深圳市房多多网络科技有限公司 | 基于安卓***的签名方法、装置以及设备 |
CN112540840A (zh) * | 2020-12-22 | 2021-03-23 | 盛银消费金融有限公司 | 一种高效的基于Java多线程和反射的任务执行方法 |
CN113378166B (zh) * | 2021-06-25 | 2024-05-31 | 北京百度网讯科技有限公司 | 调用操作***的应用程序接口api的方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1916842A (zh) * | 2006-09-06 | 2007-02-21 | 上海科泰世纪科技有限公司 | 构件化软件***中实现反射机制的构件封装方法 |
CN105389222A (zh) * | 2015-12-15 | 2016-03-09 | 中国科学院声学研究所 | 一种动态调用原生接口的方法、装置和*** |
CN105956456A (zh) * | 2016-04-26 | 2016-09-21 | 南京邮电大学 | 一种对Android***进行四重联合签名验证的实现方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101398779A (zh) * | 2007-09-26 | 2009-04-01 | 国际商业机器公司 | 测试逻辑与服务器端对象的松耦合式测试方法和*** |
-
2016
- 2016-10-20 CN CN201610914753.2A patent/CN106502668B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1916842A (zh) * | 2006-09-06 | 2007-02-21 | 上海科泰世纪科技有限公司 | 构件化软件***中实现反射机制的构件封装方法 |
CN105389222A (zh) * | 2015-12-15 | 2016-03-09 | 中国科学院声学研究所 | 一种动态调用原生接口的方法、装置和*** |
CN105956456A (zh) * | 2016-04-26 | 2016-09-21 | 南京邮电大学 | 一种对Android***进行四重联合签名验证的实现方法 |
Non-Patent Citations (1)
Title |
---|
基于跨语言对象迁移策略的复合本地对象模型;黄玉坤 等;《计算机研究与发展》;20150115;第141-155页 |
Also Published As
Publication number | Publication date |
---|---|
CN106502668A (zh) | 2017-03-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106502668B (zh) | 一种实现Android JNI反射的接口封装方法及*** | |
US9183032B2 (en) | Method and system for migration of multi-tier virtual application across different clouds hypervisor platforms | |
Kukkala et al. | UML 2.0 profile for embedded system design | |
Vrijders et al. | Prototyping the recursive internet architecture: the IRATI project approach | |
CN105446806B (zh) | 一种应用程序无响应的处理方法及装置 | |
CN107181679A (zh) | 一种端口绑定实现方法及装置 | |
CN102915236B (zh) | 使用硬件抽象执行软件应用程序的方法和*** | |
CN105677302A (zh) | 一种应用程序模块化开发方法以及装置 | |
CN111290778A (zh) | Ai模型的包装方法、平台及电子设备 | |
CN104965750A (zh) | 基于Python语言的Rapidio切换器逻辑仿真验证平台及方法 | |
CN102073633A (zh) | 资源文件的存储访问方法及装置 | |
CN105159670A (zh) | 一种通用座舱显示控制***软件开发框架 | |
CN112667305A (zh) | 页面展示方法及装置 | |
CN109857468A (zh) | 一种在单Linux***镜像中支持多DTB的方法及*** | |
CN107205015A (zh) | 开放接口的实现方法和装置 | |
CN100437513C (zh) | 实现自动测试的方法与*** | |
CN107832056A (zh) | 基于jni的c++中java函数调用方法 | |
CN103631645A (zh) | 一种基于数字医疗的数字家庭中间件*** | |
CN106201526A (zh) | 业务组件化方法及*** | |
Gao et al. | Applying Aspect-Orientation in Designing Security Systems: A Case Study. | |
CN112379886A (zh) | 数据格式转换***及其方法 | |
CN109032576A (zh) | 一种基于配置的跨平台应用生成方法及装置 | |
US20190005255A1 (en) | Protecting restricted information when importing and exporting resources | |
CN101882190B (zh) | 字节码中间表示程序的分模块形式化验证方法 | |
CN109710382A (zh) | 一种虚拟化平台构建方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |