Android系统基于JNI多线程调用Qt绘图的装置和方法与流程

文档序号:13983523阅读:614来源:国知局
Android系统基于JNI多线程调用Qt绘图的装置和方法与流程

本发明涉及嵌入式平台绘图领域,特别涉及一种android基于jni多线程调用qt绘图的装置和方法。



背景技术:

目前,采用android操作系统的智能终端被广泛使用。android系统中通常使用图形处理引擎,2d部分是androidsdk内部自己提供,3d部分是用opengles1.0,2d部分使用的api主要都在android.graphics和android.graphics.drawable包中,其提供了图形处理相关的canvas、colorfilter、point(点)和retcf(矩形)等,还有一些动画相关的诸如animationdrawable、bitmapdrawable和transitiondrawable等。以图形处理来说,最常用的是在一个view上画一些图片、形状或者自定义的文本内容,而目前这些内容均是使用canvas来实现的,通过获取view中的canvas对象,绘制一些自定义形状,然后调用view.invalidate方法让view重新刷新,继而绘制一个新的形状,这样就达到2d动画效果。canvas对象的获取方式有两种:一种是通过重写view.ondraw方法,另一种就是使用创建的方式。但是在实践中,android通过canvas绘图较慢,难以达到要求,导致成本的浪费。



技术实现要素:

有鉴于此,本发明的目的在于提供一种android系统通过jni多线程调用qt绘图的装置和方法,其采用surfaceview进行局部刷新技术,多线程技术,qt绘图技术,有效地解决了android系统通过canvas绘图较慢的问题。

本发明的第一方面,提供一种android系统基于jni多线程调用qt绘图类的方法,所述方法包括:

画布初始化步骤,运行android系统,清空系统内存,进行画布初始化,激活so动态库进行qt绘图类的调用准备,如果该画布初始化失败,则重新进行so动态库的激活;

线程启动步骤,所述so动态库被成功激活后,在第一语言的环境下同时启动第一线程和第二线程,所述第一线程为图像数据采样线程,第二线程为surfaceview画图线程;以及

图像绘制步骤,执行所述第一线程的操作,通过画图动作motionevent事件,生成坐标点,采用rect命令根据所生成的坐标点绘制矩形框,并将点坐标float(x,y)加载到so动态库,qt绘图类根据点坐标float(x,y)进行绘图,同时执行第二线程,利用android系统自身的surfaceview进行绘图,并将通过surfaceview绘制的图面显示在显示器中。

优选地,根据本发明的qt绘图类调用方法,在所述图像绘制步骤中,执行第二线程,利用android自身的surfaceview进行绘图的工作包括以下步骤:

surfaceview根据所述第一线程中通过画图动作motionevent生成的rect向so动态库请求图片数据;

所述so动态库根据rect生成图片数据并将该图片数据传送给qt绘图类,qt绘图类获得所述图片数据,将绘制的结果qimage传回到so动态库;所述so动态库将qimage传给jni层,进行jni数据转换;

jni经过数据转换成android需要的byte[]数据类型;以及

android系统自身的surfaceview根据传来的byte[]数据进行绘图。

优选地,根据本发明的qt绘图类调用方法,所述第一线程的具体执行步骤包括:

在java类中声明本地方法;

生成扩展名为h的头文件;

编写所述本地方法,从而实现如下方法:该方法的名称与javah命令所生成的头文件中所声明的方法相同;以及

编写mk文件,并自动生成一个so文件。

优选地,根据本发明的qt绘图类调用方法,通过在android系统中加载so文件提供的api:voidsystem.load,从而完成对调用所述so动态库的文件。

优选地,根据本发明的qt绘图类调用方法,其中采用预设的调用接口实现所述第一语言和第二语言环境的融合,所述第一语言为java,第二语言为c++,所述预设的调用接口为java本地接口jni。

本发明的另一方面,提供一种android系统基于jni多线程调用qt绘图类的装置,所述装置包括:

画布初始化模块,运行android系统,清空系统内存,进行画布初始化,激活so动态库进行qt绘图类的调用准备,如果该画布初始化失败,则重新进行so动态库的激活;

线程启动模块,所述so动态库激活成功后,在第一语言的环境下同时启动第一线程和第二线程,第一线程为图像数据采集线程,第二线程为surfaceview画图线程。

绘图控制模块,控制所述第一线程和所述第二线程的运行,通过预设的调用接口调用由第二语言实现的qt绘图类进行图形绘制并将绘制完成的图面显示在设备的显示器中。

进一步地,根据本发明的qt绘图类调用装置,所述第一语言为java,所述第二语言为c++,所述预设的调用接口为java本地接口jni。

进一步地,根据本发明的qt绘图类调用装置,所述绘图控制模块(103)包括:

预调用模块,在java类中加载指定c文件编译后生成的类库,其中所述c文件中含有所述使用c/c++实现的qt绘图类且所述c文件中引入了jni.h头文件,所述java类中声明了所述qt绘图类;

调用执行模块,采用所述预设的调用接口直接调用qt绘图类;和

绘图执行模块,根据所述调用执行模块所调用的qt绘图类以及android系统自身的surfaceview进行绘图。

进一步地,根据本发明的qt绘图类调用装置,所述绘图执行模块执行所述第一线程的操作,通过画图动作motionevent事件,生成坐标点,采用rect命令,根据所生成的坐标点绘制矩形框,并将点坐标float(x,y)加载到so动态库,qt绘图类根据点坐标float(x,y)进行绘图,同时执行第二线程,利用android系统自身的surfaceview进行绘图,并将通过surfaceview绘制的图面显示在显示器中。

本发明中,android系统通过jni多线程调用第三方so动态库进行绘图后,绘图速度提升明显,没有了以前的顿挫感,线性连贯,提高用户体验。而且实现了跨平台:qt绘图程序还可以生成ios和windowsphone所需动态库,在ios和windowsphone上也可以直接调用,核心代码只维护一套。由此,节省了开发时间并提高了工作效率。

附图说明

图1为本发明实施例的android系统基于jni多线程调用qt绘图类的方法流程图。

图2为本发明实施例的android系统基于jni多线程调用qt绘图类的方法中第一线程的具体执行步骤的流程图。

图3为本发明实施例的android系统基于jni多线程调用qt绘图类的装置框图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。

需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。

正如本领域技术人员周知的那样,qt是1991年奇趣科技开发的一个跨平台的c++图形用户界面应用程序框架,其提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能,其在嵌入式平台绘图方面有非常优异的表现。

如本案的背景技术部分所陈述的那样,android通过canvas绘图较慢,绘图方面的效率远不及qt,因此,本案的发明人尝试android系统调用qt进行绘图,并采用由qt编写的so动态库,由此解决了android通过canvas绘图较慢的技术问题。

android系统上层的application和applicationframework都是使用java编写,底层包括系统和使用众多的libraries都是c/c++编写的,故上层java要调用底层的c/c++函数库必须通过java的jni来实现。jni(javanativeinterface的缩写,其中文含义为‘java本地接口’)是用于让运行在jvm中的java代码和运行在jvm外的本地代码(主要是c或者c++)沟通的桥梁,其作为连接java和本地c资源的一个非常重要的技术,jni提供了若干的api(applicationprogramminginterface的缩写,其含义为‘应用程序编程接口’)实现了java和其他语言之间的通信(主要是c&c++)。从java1.1开始,jni标准成为java平台的一部分,其允许java代码和其他语言编写的代码之间进行交互。另外,jni优势在于:提高程序执行效率,高性能的应用逻辑,保密的应用逻辑,防止反编译,对于多个系统的整合,代码复用方面都有很大优势。

本发明的特征点在于,android系统使用jni技术,采用surfaceview进行局部刷新技术,多线程技术,qt绘图技术。本发明主要应用于如下场合:需要复杂的数学运算,消耗比较高的硬件资源的情形,比如绘图、pdf、chm解析之类;跨平台编程的项目需求,比如要开发一个相对大型项目运行在android、ios和windowsphone上面,此时,可将核心的项目模块拿出来用c/c++实现,生成各个系统所需的动态库,即可实现在android,ios和windowsphone上直接调用,从而节省开发时间、提高工作效率,同时提高代码安全性。

本发明中,为了实现android系统对qt的调用以实现快速绘图功能,android系统使用jni来调用qt,jni与qt采用如下方式进行交互。

1.使用jni来实现qt程序方法(即nativemethods:本地方法),并在java程序中调用它们;

2.jni支持一个“调用接口(invocationinterface)”,其允许将一个jvm嵌入到qt程序中,qt程序可以链接一个实现了jvm的本地库,然后使用“调用接口”来执行由java语言编写的软件模块。

以下,参照附图对本发明的android系统基于jni多线程调用qt绘图类并完成绘图的原理进行说明。

如图1所示,为本发明的android系统基于jni多线程调用qt绘图类的方法流程图,其主要包括如下的步骤。

首先,运行android系统,激活so动态库(即,清空系统内存,执行画布初始化),进入qt绘图类调用准备阶段,如果画布初始化失败,则重新进行so动态库的激活(可简称为“画布初始化步骤”)。

其次,so动态库被成功激活后,在第一语言的环境下同时启动第一线程和第二线程,第一线程为图像数据采样线程,第二线程为surfaceview画图线程(可简称为“线程启动步骤”)。

最后,执行第一线程的操作,通过ontouchevent(画图动作motionevent)事件,生成坐标点,采用rect命令,根据所生成的坐标点绘制矩形框,并将点坐标float(x,y)加载到so动态库,qt绘图类根据点坐标float(x,y)进行绘图,同时执行第二线程,利用android自身的surfaceview进行绘图,并将通过surfaceview绘制的图面显示在显示器中(可简称为“图像绘制步骤”)。

在上述图像绘制步骤中,执行第二线程,利用android自身的surfaceview进行绘图的工作包括以下步骤:

第一步,surfaceview根据第一线程中通过画图动作motionevent生成的rect向so动态库请求图片数据。

第二步,so动态库根据rect生成图片数据并将该图片数据传送给qt绘图类,qt绘图类获得所述图片数据,将绘制的结果qimage传回到so动态库。

第三步,so动态库将qimage传给jni层,进行jni数据转换。

第四步,jni经过数据转换成android需要的byte[]数据类型。

第五步,android系统自身的surfaceview根据传来的byte[]数据进行绘图。

在本发明中,android系统中调用动态库文件(*.so)都是通过在android系统中加载so文件提供的api:voidsystem.load(stringpathname)实现的。

在本发明中,采用预设的调用接口实现两种语言环境的融合。作为示例,第一语言为java,第二语言为c++,上述预设的调用接口优选java本地接口jni。

本发明中,通过jni调用qt绘图函数,图2为本发明实施例的第一线程的具体执行步骤的流程图,如附图2所示,其具体执行步骤包括:首先,在步骤s201中,在java类中声明native(本地)方法。

加载动态库system.loadlibrary(“jnipaint”),本发明中优选以static块进行加载,同时需要注意的是system.loadlibrary();的参数“jnipaint”是动态库的名字,其部分代码例如如下所示:

其次,在步骤s202中,生成扩展名为h的头文件。

该h文件相当于java类里面的接口,这里声明了一个java_com_hht_jnipaint_jnipaint_mousepress方法,然后在上述本地方法里面实现该方法。

在步骤s203中,编写所述本地方法,从而实现如下方法:该方法的名称与javah命令所生成的头文件中所声明的方法相同。

在步骤s204中,编写mk文件,并自动生成一个so文件。

根据上述实施方式可知,根据本发明的调用方法,当android系统基于jni多线程调用qt绘图类后,绘图速度提升明显,没有了以前的顿挫感,线性连贯。

本发明的另一实施方式,提供一种android系统基于jni多线程调用qt绘图类的装置。如图3所示,示出了本发明实施例的android通过jni多线程调用qt绘图类的装置,该装置100包括:

画布初始化模块101,用于运行android系统,清空系统内存,进行画布初始化,激活so动态库进行qt绘图类的调用准备,如果该画布初始化失败,则重新进行so动态库的激活。

线程启动模块102,so动态库激活成功后,在第一语言的环境下同时启动第一线程和第二线程,第一线程为图像数据采集线程,第二线程为surfaceview画图线程。

绘图控制模块103,控制上述第一线程和第二线程的运行,通过预设的调用接口调用由第二语言实现的qt绘图类进行图形绘制并将绘制完成的图面显示在设备的显示器中。

优选地,在本发明中,采用预设的调用接口实现两种语言环境的融合。作为示例,上述第一语言为java,第二语言为c++,上述预设的调用接口为java本地接口jni。

在本发明中,上述绘图控制模块103包括:

预调用模块1031,用于在java类中加载指定c文件编译后生成的类库,其中所述c文件中含有所述使用c/c++实现的qt绘图类且所述c文件中引入了jni.h头文件,所述java类中声明了所述qt绘图类。

调用执行模块1032,采用预设的调用接口直接调用qt绘图类。

绘图执行模块1033,根据调用执行模块1032所调用的qt绘图类以及android系统自身的surfaceview进行绘图。

在本发明中,绘图执行模块1033执行第一线程的操作,通过ontouchevent(画图动作motionevent)事件,生成坐标点,采用rect命令,根据所生成的坐标点绘制矩形框,并将点坐标float(x,y)加载到so动态库,qt绘图类根据点坐标float(x,y)进行绘图,同时执行第二线程,利用android系统自身的surfaceview进行绘图,并将通过surfaceview绘制的图面显示在显示器中。

可选地,本发明的动态库也可以由mfc编写或者第三方库,如:开源图形库freeimage,开源图形库cximage等。

进一步地,在本发明中,qt绘图程序还可以生成ios和windowsphone所需动态库,在ios和windowsphone上也可以直接调用,而且核心代码只维护一套,故能够节省开发时间并提高工作效率。

如上所述,根据本发明的上述调用装置,android系统基于jni多线程调用第三方so库进行绘图后,绘图速度明显提升,同时实现了跨平台调用。

所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本发明的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,并存在如上所述的本发明的不同方面的许多其它变化,为了简明它们没有在细节中提供。因此,凡在本发明的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1