Qt移动应用开发(七):QML与Java的交互

http://blog.csdn.net/gamesdev/article/details/37997555


Qt移动应用开发(七):QML与Java的交互

         上一篇文章讲到了如何实现QML和C++的交互,QML和C++的交互方法有很多,它们分别为使用上下文变量、注册QML类以及注册QML单例。那么这一次我们要了解如何使QML和Java进行交互。这里主要讲的是在Android系统下的实现,不适用于桌面平台J2SE的JVM。

原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/37997555

         Qt5中针对不同的平台适配并开发了不同的模块,比如说Qt Windows Extras、Qt Mac Extras、Qt X11 Extras、Qt Android Extras等。这里我们主要聚焦Qt Android Extras,教大家如何使用这个模块实现和Java的交互。

         QtAndroid Extras模块包含了三个类以及一个命名空间。QAndroidActivityReceiver用来接收Android的Activity的结果的;QAndroidJniEnvironment用来访问JNI环境变量的;QtAndroidJniObject就对应dalvik虚拟机中的普通Java类。此外QtAndroid命名空间中有一些有用的全局函数来与Java代码进行交互,比如使用QtAndroid::androidActivity()来获得当前运行的Activity。

         我的独立游戏《吃药了》是包含了移动广告的,移动广告商的SDK是一个jar包,似乎无法整合进入我的项目,但是好就好在有Qt Android Extras模块,我利用这个模块再加上QML和C++的交互,最终让整合得以实现。我是使用这样一套方法实现QML调用Java代码的:

上一篇文章介绍的三种方法中,我选择了使用QML调用C++注册的单例函数这样的方法来实现调用C++代码,然后再通过QtAndroidJniObject::callMethod()来调用Java的本地方法。为了实现这样一个功能,除了在上篇文章介绍的注册QML单例之外,还必须在该函数中调用Android方法。下面是SDActivityDelegateSingleton类的实现:

SDActivityDelegateSingleton.h

[cpp]  view plain copy
  1. #ifndef ADSINGLETON_H  
  2. #define ADSINGLETON_H  
  3.   
  4. #include <QObject>  
  5.   
  6. // Android:绑定SuperDoctorActivity,负责广告API的调用  
  7. class SDActivityDelegateSingleton: public QObject  
  8. {  
  9.     Q_OBJECT  
  10. public:  
  11.     SDActivityDelegateSingleton( QObject* pParent = Q_NULLPTR ):  
  12.         QObject( pParent )  
  13.     {  
  14.     }  
  15.   
  16.     Q_INVOKABLE void call( const QString& methodName );  
  17. };  
  18.   
  19. #endif // ADSINGLETON_H  

SDActivityDelegateSingleton.cpp

[cpp]  view plain copy
  1. #include "SDActivityDelegateSingleton.h"  
  2. #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)  
  3. #include <QtAndroid>  
  4.   
  5. void SDActivityDelegateSingleton::call( const QString& methodName )  
  6. {  
  7.     const QAndroidJniObject& activity = QtAndroid::androidActivity( );  
  8.     qDebug( "method name is: %s", qPrintable( methodName ) );  
  9.     activity.callMethod<void>( qPrintable( methodName ) );  
  10. }  
  11. #else  
  12. void SDActivityDelegateSingleton::call( const QString& methodName )  
  13. {  
  14.     qDebug( "the desktop does not implement calling method: %s",  
  15.             qPrintable( methodName ) );  
  16. }  
  17. #endif  

然后在是SuperDoctorActivity.java:

[java]  view plain copy
  1. // SuperDoctorActivity.java 这个Java文件重写了Android的Activity  
  2.   
  3. package com.jcystudio.superdoctor;  
  4.   
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.FrameLayout;  
  9. import android.view.Gravity;  
  10. import org.qtproject.qt5.android.bindings.QtActivity;  
  11. ……  
  12.   
  13. public class SuperDoctorActivity extends QtActivity  
  14. {  
  15.     @Override  
  16.     public void onCreate( Bundle savedInstanceState )  
  17.     {  
  18.         super.onCreate(savedInstanceState);  
  19.         ……  
  20.         SmartBannerManager.init(this);  
  21.     }  
  22.   
  23.     ……  
  24.   
  25.     public void showSmartAD( )  
  26.     {  
  27.         SmartBannerManager.show( this );  
  28.     }  
  29. }  

         这样,通过QML就可以调用Java代码了,调用方法是:

[javascript]  view plain copy
  1. ……     
  2. function prepare( )  
  3. {  
  4.     SDActivity.call( "showSmartAD" );// ←调用Java方法  
  5.     this.focus = true;// 获得按键焦点,可以使用按键控制  
  6.     Controller.clearBlocks( );  
  7.     Controller.setupGame( mode, difficulty, map, actions, colors );  
  8.     headerSprite.currentFrame = 2;// 小人指向平常的位置  
  9.     readyMask.visible = true;  
  10.     backgroundMusic.play( );  
  11. }  
  12. ……  

使用这样的方法可以调用第三方Jar包代码,我想调用so库的代码也是可以的。

顺便说一声,其实我的独立游戏一开始不叫《吃药了》的,叫做《超级灭菌医生》,其中也有一段时间我的游戏名称叫做《超级医生》。后面赶上网络上吃药了这个段子我才将自己的游戏名称改为《吃药了》。我在每一次游戏开发的里程碑时都会为游戏截个图。一个多月下来,截了不少图片了。下面我将这些图片拼起来,做成一个gallery,供大家观赏。


《吃药了》下载地址:这里


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值