CN104407864A - 一种jni层的算法进行多实例调用的封装方法和系统 - Google Patents

一种jni层的算法进行多实例调用的封装方法和系统 Download PDF

Info

Publication number
CN104407864A
CN104407864A CN201410691198.2A CN201410691198A CN104407864A CN 104407864 A CN104407864 A CN 104407864A CN 201410691198 A CN201410691198 A CN 201410691198A CN 104407864 A CN104407864 A CN 104407864A
Authority
CN
China
Prior art keywords
jni
layer
class
pointer
algorithm
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
Application number
CN201410691198.2A
Other languages
English (en)
Other versions
CN104407864B (zh
Inventor
李小朋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guangdong Oppo Mobile Telecommunications Corp Ltd
Original Assignee
Guangdong Oppo Mobile Telecommunications Corp Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Guangdong Oppo Mobile Telecommunications Corp Ltd filed Critical Guangdong Oppo Mobile Telecommunications Corp Ltd
Priority to CN201410691198.2A priority Critical patent/CN104407864B/zh
Publication of CN104407864A publication Critical patent/CN104407864A/zh
Application granted granted Critical
Publication of CN104407864B publication Critical patent/CN104407864B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种JNI层的算法进行多实例调用的封装方法和系统。该方法包括:JAVA层创建用于与JNI层通信的接口类;JNI层创建算法库的对象,并为所述对象赋予指针;根据所述指针创建所述接口类的类对象;将所述类对象返回到JAVA层保存。通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。

Description

一种JNI层的算法进行多实例调用的封装方法和系统
技术领域
本发明涉及数据调用领域,尤其涉及一种JNI层的算法进行多实例调用的封装方法和系统。
背景技术
Android系统有时候需要提升执行速度及效率,有些核心的算法,或者在JAVA层执行比较耗时的地方,一般会通过C或者C++来实现部分核心的算法,然后把结果提供给JAVA层,比如对图片进行某些效果处理,在效果处理方面如果能用C++来实现效率和速度都会更快,这样就不可避免地会使用到JNI调用。
在某些场合下可能同时调用JNI的某个算法,这种场景比较多,比如采用JNI实现人脸识别的算法,在图片快速滑动过种中需要进行人脸检测,如果此时检测到人脸的同时此时又去进行人脸编辑(比如美妆)等效果的处理(因为也需要对人脸进行检测),此时就会碰到,如果JNI的算法对象只有单实例时,就会出现只有等第一次人脸检测算法的实例跑完并且销毁该对象时才能进行下一次的人脸识别的算法调用,这样局限性大大提高了。
发明内容
本发明提出了一种JNI层的算法进行多实例调用的封装方法和系统,其通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。
为实现上述设计,本发明采用以下技术方案:
一方面采用一种JNI层的算法进行多实例调用的封装方法,包括:
JAVA层创建用于与JNI层通信的接口类;
JNI层创建算法库的对象,并为所述对象赋予指针;
根据所述指针创建所述接口类的类对象;
将所述类对象返回到JAVA层保存。
其中,所述接口类中包括一个带参数的构造函数;
所述根据所述指针创建所述接口类的类对象,包括:
通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数;
获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
其中,还包括:
JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
其中,所述构造函数的参数的类型为INT型参数。
其中,所述JAVA层的初始化方法为静态方法。
另一方面采用一种JNI层的算法进行多实例调用的封装系统,包括:
接口类创建单元,用于JAVA层创建用于与JNI层通信的接口类;
算法库创建单元,用于JNI层创建算法库的对象,并为所述对象赋予指针;
类对象创建单元,用于根据所述指针创建所述接口类的类对象;
保存封装单元,用于将所述将所述类对象返回到JAVA层保存。
其中,所述接口类中包括一个带参数的构造函数;
所述类对象创建单元,包括:
接口通信模块,用于通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数;
类对象创建模块,用于获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
其中,还包括:
算法调用单元,用于JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
其中,所述构造函数的参数的类型为INT型参数。
其中,所述JAVA层的初始化方法为静态方法。
本发明的有益效果在于:通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本发明实施例的内容和这些附图获得其他的附图。
图1是本发明实施例提供的一种JNI层的算法进行多实例调用的封装方法的第一实施例的方法流程图。
图2是本发明实施例提供的一种JNI层的算法进行多实例调用的封装方法的第二实施例的方法流程图。
图3是本发明实施例提供的一种JNI层的算法进行多实例调用的封装系统的第一实施例的结构方框图。
图4是本发明实施例提供的一种JNI层的算法进行多实例调用的封装系统的第二实施例的结构方框图。
具体实施方式
为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参考图1,其是本发明实施例提供的一种JNI层的算法进行多实例调用的封装方法的第一实施例的方法流程图,本方案中的封装方法主要用于计算机程序中的跨语言调用,以实现降低对不同语言的优势利用,提高程序运行的速度和效率。如图所示,该JNI层的算法进行多实例调用的封装方法,包括:
步骤S101:JAVA层创建用于与JNI层通信的接口类。
接口类与对象通过JNI环境实现跨语言的通信。
步骤S102:JNI层创建算法库的对象,并为所述对象赋予指针。
在JNI层创建一个核心算法的对象,例如人脸识别及相关效果处理的算法库,在算法库中的对象会赋予指针以作为JAVA的调用的索引。
步骤S103:根据所述指针创建所述接口类的类对象。
通过JNI环境查找到JAVA层中的接口类,确认该对象即为接口类的目标对象,获取该对象的指针,以备将该指针返回到JAVA层中保存。
步骤S104:将所述类对象返回到JAVA层保存。
JAVA层在接收到该指针之后,将指针与接口类对应保存,在需要调用该对象时,直接通过指针调用即可。
综上所述,通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。
请参考图2,其是本发明实施例提供的一种JNI层的算法进行多实例调用的封装方法的第二实施例的方法流程图。如图所示,该JNI层的算法进行多实例调用的封装方法,包括:
步骤S201:JAVA层创建用于与JNI层通信的接口类。
所述接口类中包括一个带参数的构造函数。所述接口类中包括一个带参数的构造函数;所述构造函数的参数的类型为INT型参数。所述JAVA层的初始化方法为静态方法。
步骤S202:JNI层创建算法库的对象,并为所述对象赋予指针。
步骤S203:通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数。
步骤S204:获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
步骤S205:将所述类对象返回到JAVA层保存。
步骤S206:JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
以下对上述步骤的具体实现方式进行进一步阐述。
1.在JAVA层创建一个接口类,例如类名为BeauFb,此类用于与JNI通信的一些接口,其中有一个初始化接口,也就是INIT接口,返回值是BeauFb的这个类对象,
public static native BeauFb init();
从上面可以看到初始化方法是一个静态方法,类名可以直接调用init这个方法,并且从JNI层会返回一个BeauFb对象。
在JAVA层中为了实现指针的反馈,设计了一个带参数的构造方法,
mNativeFbmain此处定义的类变量就是算法库中对象的指针,具体在本实施例中就是后文中的Fbmain类对象的指针。
2.在JNI层可以会看到init是如何实现创建一个对象并且返回给JAVA层一个BeauFb对象的。在JNI层会先创建一个核心算法的对象,比如人脸识别及相关效果处理的算法库,在init中创建一个这样的对象,如下:
Fbmain*fbmain=new Fbmain(env,clazz);
其实现了创建一个算法库的对象,并把指针赋值给fbmain。
3.以下是实现本方案的关键步骤。在步骤2中的init方法中,会通过JNI环境先去查找到JAVA层的取名为BeauFb的这个类:
gBeauFb_class=env->FindClass("com/beau/BeauFbProcess/BeauFb");
然后获取到BeauFb的类的构造方法:
gBeauFb_constructorMethodID=env->GetMethodID(gBeauFb_class,"<init>","(I)V");
参数的最后一个"(I)V"表示传入一个INT型的变量和Void的返回类型,所以之前在JAVA层的BeauFb中需要创建一个带INT型参数的构造方法,这个很重要,因为带INT型参数的构造函数中,这个INT型参数就是用于记录创建每个人脸识别及效果处理的算法库Fbmain类对象的指针。
再获取构造方法中的成员变量,也就是步骤1中创建的用于保存算法库中的一个对象的指针的mNativeFbmain:
gBeauFb_nativeInstanceID=env->GetFieldID(gBeauFb_class,"mNativeFbmain","I")。
最后将算法库的对象指针用来进行BeauFb类的构造函数的创建:
env->NewObject(gBeauFb_class,gBeauFb_constructorMethodID,static_cast<jint>(reinterpret_cast<uintptr_t>(fbmain)))
这样就构建一个BeauFb类对象,并且传的参数为fbmain指针,这样就可以创建了一个BeauFb类对象,并且与人脸识别的核心算法库的对象指针fbmain有联系了。
JNI层的init方法会返回这个BeauFb类对象到JAVA层,JAVA层可以以这个类对象实现算法库的JNI调用了。
4.在JNI层,可以通过BeauFb类对象实现,通过gBeauFb_nativeInstanceID来获取到当前该BeauFb所管理的Fbmain人脸识别的算心算法库的对象指针,借此就可以操作算法库的人脸识别的一些其它方法了,代码如下,
这样就可以实现JNI多实例的人脸识别算法库的对象了,多实例的关键步骤3,因为步骤3在创建BeauFb这个JAVA类对象时,会把之前创建一个人脸核心算法库的对象的指针传入到JAVA层,这样每个BeauFb JAVA类对象实例时就与同时JNI层创建的人脸核心算法库联系在一起了,这样就可以通过BeauFb对象实例操作JNI层的人脸核心算法库的实例了。
综上所述,通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。而在具体的指针返回的过程中,通过构造函数基于指针生成接口类的类对象,实现了JAVA层和JNI层之间的对象的关联,封装方便。
以下为本方案一种JNI层的算法进行多实例调用的封装系统的实施例,封装系统的实施例基于封装方法的实施例实现,在封装系统的实施例中未尽的描述,请参考封装方法的实施例。
请参考图3,其是本发明实施例提供的一种JNI层的算法进行多实例调用的封装系统的第一实施例的结构方框图。如图所示,该封装系统包括:
接口类创建单元310,用于JAVA层创建用于与JNI层通信的接口类;
算法库创建单元320,用于JNI层创建算法库的对象,并为所述对象赋予指针;
类对象创建单元330,用于根据所述指针创建所述接口类的类对象;
保存封装单元340,用于将所述将所述类对象返回到JAVA层保存。
综上所述,上述各单元的协同工作,通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。
请参考图4,其是本发明实施例提供的一种JNI层的算法进行多实例调用的封装系统的第二实施例的结构方框图。如图所示,该封装系统包括:
接口类创建单元310,用于JAVA层创建用于与JNI层通信的接口类;
算法库创建单元320,用于JNI层创建算法库的对象,并为所述对象赋予指针;
类对象创建单元330,用于根据所述指针创建所述接口类的类对象;
保存封装单元340,用于将所述将所述类对象返回到JAVA层保存。
其中,所述接口类中包括一个带参数的构造函数;
所述类对象创建单元330,包括:
接口通信模块331,用于通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数;
类对象创建模块332,用于获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
其中,还包括:
算法调用单元350,用于JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
其中,所述构造函数的参数的类型为INT型参数。
其中,所述JAVA层的初始化方法为静态方法。
综上所述,各个单元的协同工作,通过在JAVA层创建接口类,在JNI层创建算法库及算法库中的对象,为对象赋予指针,并将指针反馈到JAVA层对应的接口类;在JAVA层调用该对象时,直接获取该对象在算法库中的对象指针即可。该封装方式很方便地实现了JNI多实例的创建与调用,封装简单实用。而在具体的指针返回的过程中,通过构造函数基于指针生成接口类的类对象,实现了JAVA层和JNI层之间的对象的关联,封装方便。
以上内容仅为本发明的较佳实施例,对于本领域的普通技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,本说明书内容不应理解为对本发明的限制。

Claims (10)

1.一种JNI层的算法进行多实例调用的封装方法,其特征在于,包括:
JAVA层创建用于与JNI层通信的接口类;
JNI层创建算法库的对象,并为所述对象赋予指针;
根据所述指针创建所述接口类的类对象;
将所述类对象返回到JAVA层保存。
2.根据权利要求1所述的一种JNI层的算法进行多实例调用的封装方法,其特征在于,所述接口类中包括一个带参数的构造函数;;
根据所述指针创建所述接口类的类对象,包括:
通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数;
获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
3.根据权利要求1所述的一种JNI层的算法进行多实例调用的封装方法,其特征在于,还包括:
JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
4.根据权利要求2所述的一种JNI层的算法进行多实例调用的封装方法,其特征在于,所述构造函数的参数的类型为INT型参数。
5.根据权利要求1所述的一种JNI层的算法进行多实例调用的封装方法,其特征在于,所述JAVA层的初始化方法为静态方法。
6.一种JNI层的算法进行多实例调用的封装系统,其特征在于,包括:
接口类创建单元,用于JAVA层创建用于与JNI层通信的接口类;
算法库创建单元,用于JNI层创建算法库的对象,并为所述对象赋予指针;
类对象创建单元,用于根据所述指针创建所述接口类的类对象;
保存封装单元,用于将所述将所述类对象返回到JAVA层保存。
7.根据权利要求6所述的一种JNI层的算法进行多实例调用的封装系统,其特征在于,所述接口类中包括一个带参数的构造函数;
所述类对象创建单元,包括:
接口通信模块,用于通过JNI环境查找到JAVA层中的接口类,获取所述接口类的构造函数;
类对象创建模块,用于获取所述对象的指针,将所述指针传到所述构造函数的参数创建一个接口类的类对象。
8.根据权利要求6所述的一种JNI层的算法进行多实例调用的封装系统,其特征在于,还包括:
算法调用单元,用于JAVA层调用所述算法库的对象时,基于所述指针通过JNI环境调用算法库中的对象。
9.根据权利要求7所述的一种JNI层的算法进行多实例调用的封装系统,其特征在于,所述构造函数的参数的类型为INT型参数。
10.根据权利要求6所述的一种JNI层的算法进行多实例调用的封装系统,其特征在于,所述JAVA层的初始化方法为静态方法。
CN201410691198.2A 2014-11-25 2014-11-25 一种jni层的算法进行多实例调用的封装方法和系统 Expired - Fee Related CN104407864B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410691198.2A CN104407864B (zh) 2014-11-25 2014-11-25 一种jni层的算法进行多实例调用的封装方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410691198.2A CN104407864B (zh) 2014-11-25 2014-11-25 一种jni层的算法进行多实例调用的封装方法和系统

Publications (2)

Publication Number Publication Date
CN104407864A true CN104407864A (zh) 2015-03-11
CN104407864B CN104407864B (zh) 2018-02-02

Family

ID=52645497

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410691198.2A Expired - Fee Related CN104407864B (zh) 2014-11-25 2014-11-25 一种jni层的算法进行多实例调用的封装方法和系统

Country Status (1)

Country Link
CN (1) CN104407864B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109373524A (zh) * 2018-11-30 2019-02-22 青岛海信日立空调系统有限公司 空调接入云端的协议转换方法、系统及空调系统
CN112416312A (zh) * 2019-08-22 2021-02-26 腾讯科技(深圳)有限公司 一种对象获取方法、装置及电子设备、存储介质
CN112416312B (zh) * 2019-08-22 2024-06-07 腾讯科技(深圳)有限公司 一种对象获取方法、装置及电子设备、存储介质

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109800057B (zh) * 2019-01-18 2021-06-01 杭州复杂美科技有限公司 对象调用方法、设备和存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050044540A1 (en) * 2003-08-19 2005-02-24 Savov Andrey I. Method and apparatus for object-to-object Java native interface mapping
CN103093136A (zh) * 2012-12-27 2013-05-08 飞天诚信科技股份有限公司 一种java应用访问智能密钥装置的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050044540A1 (en) * 2003-08-19 2005-02-24 Savov Andrey I. Method and apparatus for object-to-object Java native interface mapping
CN103093136A (zh) * 2012-12-27 2013-05-08 飞天诚信科技股份有限公司 一种java应用访问智能密钥装置的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
QINJUNING: "《JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递》", 《HTTP://BLOG.CSDN.NET/QINJUNING/ARTICLE/DETAILS/7607214》 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109373524A (zh) * 2018-11-30 2019-02-22 青岛海信日立空调系统有限公司 空调接入云端的协议转换方法、系统及空调系统
CN112416312A (zh) * 2019-08-22 2021-02-26 腾讯科技(深圳)有限公司 一种对象获取方法、装置及电子设备、存储介质
CN112416312B (zh) * 2019-08-22 2024-06-07 腾讯科技(深圳)有限公司 一种对象获取方法、装置及电子设备、存储介质

Also Published As

Publication number Publication date
CN104407864B (zh) 2018-02-02

Similar Documents

Publication Publication Date Title
JP6912583B2 (ja) サービス処理方法および装置
US9183032B2 (en) Method and system for migration of multi-tier virtual application across different clouds hypervisor platforms
WO2019104973A1 (zh) 跨语言调用方法、服务器及存储介质
US8434070B2 (en) Generating specifications of client-server applications for static analysis
KR20170003578A (ko) 언어-독립형 디스패치를 위한 코드 서비스 기법
US20120102474A1 (en) Static analysis of client-server applications using framework independent specifications
CN110908697B (zh) 一种资源打包方法、装置、服务器及存储介质
CN106547580B (zh) 挂钩函数的方法、装置、移动终端及存储介质
CN108021400B (zh) 数据处理方法及装置、计算机存储介质及设备
JP7047068B2 (ja) メディア作品にカスタムアルゴリズムを実行するための拡張可能な手法
CN111784000B (zh) 数据处理方法、装置和服务器
US20200097553A1 (en) Cognitive translation service integrated with context-sensitive derivations for determining program-integrated information relationships
US20180025162A1 (en) Application program analysis apparatus and method
CN105975277A (zh) 一种基于模板的混合云弹性伸缩组构建方法
CN107273226B (zh) 在安卓系统中集成组件及调用被集成组件的方法和装置
CN110727504B (zh) 代码执行方法、装置和渲染设备
CN104407864A (zh) 一种jni层的算法进行多实例调用的封装方法和系统
CN112947916A (zh) 用于实现在线画布的方法、装置、设备以及存储介质
CN113760264A (zh) 多应用之间组件复用的方法和装置
CN110764779B (zh) 封装方法、注册方法、装置和渲染设备
CN113407259B (zh) 加载场景的方法、装置、设备以及存储介质
US20150373071A1 (en) On-demand helper operator for a streaming application
CN107092601B (zh) 资源文件构建方法、资源文件应用方法及装置
US9736176B2 (en) System and method for detecting security exposures of VOIP devices
CN103914304A (zh) 一种基于sap平台的不同结构类型参数转换方法

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
CP01 Change in the name or title of a patent holder

Address after: Changan town in Guangdong province Dongguan 523860 usha Beach Road No. 18

Patentee after: GUANGDONG OPPO MOBILE TELECOMMUNICATIONS Corp.,Ltd.

Address before: Changan town in Guangdong province Dongguan 523860 usha Beach Road No. 18

Patentee before: GUANGDONG OPPO MOBILE TELECOMMUNICATIONS Corp.,Ltd.

CP01 Change in the name or title of a patent holder
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20180202

CF01 Termination of patent right due to non-payment of annual fee