Qt开发安卓程序之一 :使用C++调用java接口的使用方法

先说些题外话,已经是6月15号了,离毕业滚出学校还有8天的时间,最近也是直接请了半个月的假,不知道下次回公司的时候,工位还在不在。
最开始接触到Qt开发安卓程序还是刚进公司的时候,那会还不会QML,通过Qt’绘制UI界面还只会傻傻的拖控件,当然,也不是说拖控件不好,开发桌面程序,拖控件绝对是最方便,最简单的UI绘制方式。
但是通过Qt开发安卓程序时,拖控件所展现出来的效果始终差强人意,开始老老实实用QML绘制UI吧,不可否认的是,QML和C++混合编程(以后有时间的话,专门来介绍一下QML和C++混合编程)已经能够独立完成开发安卓的一些小程序,但是当需要使用到安卓设备的一些硬件设施(蓝牙,wifi,电池电量,屏幕亮度等)的时候,就不得不调用一下安系统的一些接口,可以说,Qt的出现,提供给了C++程序猿开发安卓程序的很好的机会。值得一提的是,Qt for Android 不像是Qt Embedded( 嵌入式Qt ), Qt Embedded会接管整个嵌入式系统的方方面面,软硬件接口的调度,而Qt for Android 属于应用层,编码时不会涉及到底层硬件的逻辑设计,(就当是安卓的桌面开发吧)。

说了那么多废话,开始正题,

想要C++调用java的接口,需要使用 QAndroidJniObject类,需要在.pro文件中加入模块 QT += androidextras
加入这个模块是因为需要用到JNI(Java Native Interface),C++和java混合编程时,互相通信的接口(我目前只理解到这一层,有兴趣的可以自己研究),Qt将JNI编程的许多接口封装了起来,写进了QAndroidJniObject这个类里面。通过这个类,将java方法在C++函数中进行方法签名,就可以实现C++与java的混合编程。
例如:

QAndroidJniObject str = QAndroidJniObject::fromString( "WDNMD" );//WDNMD意思是唯独你不懂
//这样就简单的构造了一个可以与java通信的C++对象str

那么如何调用java对象的方法呢?

需要使用QAndroidJniObject类的callMethod方法

jchar c = str.callMethod<jchar>( "charAt", "(I)C", 1000 );

这行代码对于C++程序猿来说,可能比较新奇,QAndroidJniObject的callMethod函数是一个模板函数,尖括号<>里面的是函数的返回类型,圆括号()里面:
-第一个参数代表java中String类中的 charAt( int index ) 函数(str可以看做为java对象).
-第二个参数 “(I)C” 中, 圆括号内的 I 代表CharAT函数的参数 index 的数据类型, C代表charAT函数的返回值类型为char,小结:"(A)R" A(agrument)代表参数类型,R代表返回值类型( JNI的数据类型与C++略微不同,此处自行百度 )
-第三个参数 1000 代表着 c传入harAt函数参数 idnex 的值 为1000(当然,此时会抛出异常,字符串WDNMD长度为5,取第一千个字符会异常)。

tips: java那么多类,如果需要构造一个对象,需要对java的类十分熟悉,Qt只对String这一个类专门封装了一个静态方法( QAndroidJniObject::fromstring( QString str ) );来直接从QString转换为 java String 的Jni对象,可能觉得String类比较常用吧。

那么如果构造java的其他类呢?–关键字"方法签名"

在Qt中构造java对象,首先要构造一个JNI对象,QAndroidJniObject代表着一个JNI对象,但问题是怎么构造一个目标类型的JNI对象?
要构造一个目标java对象,需要以对象的 “类名” 和 “构造器” 的方法签名作为参数来构造QAndroidJniObject的一个JNI对象,还是以String为例:
如果不指定构造函数,使用默认的构造函数,如下:

QString jstringFullName = "java/lang/String";// 对于类名(对象类型)需要提供完整的包名,此处为String类型完成的包名

QAndroidJniObject constructByDefulatStr(  jstringFullName );

如此便使用java String的默认的构造函数创建了一个String类型的Jni对象

如果指定了构造函数:

QString str = "WDNMD"; //目标字符串

QString jstringFullName = "java/lang/String";// 对于类名(对象类型)需要提供完整的包名,此处为String类型完成的包名

QAndoridJniObject constructByAimConstructor( jstringFullName, "(Ljava/lang/String)V", str );//
//此处的方法签名可能很多人0基础的观众看不懂,此处的方法签名即圆括号里面的内容 
//"Ljava/lang/String" 是个啥东西,对于返回值是类名的函数,需要输入匹配完整的java包名,并且需以 L 开头, 以 ; 结尾。
// V 的代表构造函数并没有返回值,所以用V

如上所述,通过QAndroidJniObject 调用java String的两种构造函数创建出的两个对象,

//通过默认构造函数创建出的java String对象
QAndroidJniObject constructByDefulatStr;

//通过带参数的构造函数创建出的对象
QAndroidJniObject constructByAimConstructor;
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值