Qt移动应用开发(七):QML与Java的交互
来源:互联网 发布:python 字典 append 编辑:程序博客网 时间:2024/05/21 20:24
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
#ifndef ADSINGLETON_H#define ADSINGLETON_H#include <QObject>// Android:绑定SuperDoctorActivity,负责广告API的调用class SDActivityDelegateSingleton: public QObject{ Q_OBJECTpublic: SDActivityDelegateSingleton( QObject* pParent = Q_NULLPTR ): QObject( pParent ) { } Q_INVOKABLE void call( const QString& methodName );};#endif // ADSINGLETON_H
SDActivityDelegateSingleton.cpp
#include "SDActivityDelegateSingleton.h"#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK)#include <QtAndroid>void SDActivityDelegateSingleton::call( const QString& methodName ){ const QAndroidJniObject& activity = QtAndroid::androidActivity( ); qDebug( "method name is: %s", qPrintable( methodName ) ); activity.callMethod<void>( qPrintable( methodName ) );}#elsevoid SDActivityDelegateSingleton::call( const QString& methodName ){ qDebug( "the desktop does not implement calling method: %s", qPrintable( methodName ) );}#endif
然后在是SuperDoctorActivity.java:
// SuperDoctorActivity.java 这个Java文件重写了Android的Activitypackage com.jcystudio.superdoctor;import android.os.Bundle;import android.util.Log;import android.widget.LinearLayout;import android.widget.FrameLayout;import android.view.Gravity;import org.qtproject.qt5.android.bindings.QtActivity;……public class SuperDoctorActivity extends QtActivity{ @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate(savedInstanceState); …… SmartBannerManager.init(this); }…… public void showSmartAD( ) { SmartBannerManager.show( this ); }}
这样,通过QML就可以调用Java代码了,调用方法是:
…… function prepare( ){SDActivity.call( "showSmartAD" );// ←调用Java方法this.focus = true;// 获得按键焦点,可以使用按键控制Controller.clearBlocks( );Controller.setupGame( mode, difficulty, map, actions, colors );headerSprite.currentFrame = 2;// 小人指向平常的位置readyMask.visible = true;backgroundMusic.play( );}……
使用这样的方法可以调用第三方Jar包代码,我想调用so库的代码也是可以的。
顺便说一声,其实我的独立游戏一开始不叫《吃药了》的,叫做《超级灭菌医生》,其中也有一段时间我的游戏名称叫做《超级医生》。后面赶上网络上吃药了这个段子我才将自己的游戏名称改为《吃药了》。我在每一次游戏开发的里程碑时都会为游戏截个图。一个多月下来,截了不少图片了。下面我将这些图片拼起来,做成一个gallery,供大家观赏。
《吃药了》下载地址:这里
- Qt移动应用开发(七):QML与Java的交互
- Qt移动应用开发(七):QML与Java的交互
- Qt移动应用开发:QML与Java的交互
- Qt移动应用开发:QML与C++的交互
- Qt移动应用开发(六):QML与C++的交互
- Qt移动应用开发(八):实现跨平台的QML和OpenGL混合渲染
- Qt与Qml交互的小Demo
- Qt移动应用开发:实现跨平台的QML和OpenGL混合渲染
- QML与c++交互学习笔记(七)
- QT QML开发andriod应用
- 一步一步学Qt(Qt Quick)/qml 开发第五篇(第一个可视的应用)
- 一步一步学Qt(Qt Quick)/qml 开发第五篇(第一个可视的应用)
- QML与C++的交互
- qml与C++的交互
- QT C++与QML 交互的那些事 之(你的就是我的我的就是你的)
- 【Qt开发】qml页面的创建、呈现与销毁
- Qt Quick5.2 开发笔记2 -------Qml 和 c++交互的探索
- QML, Qt C++混合编程--QML与Qt C++ 交互机制探讨与总结
- 自制小shell
- String内存溢出异常(错误)可能的原因及解决方案
- JNI编程注意事项
- 菜鸟学习之---日期转换
- express 4x API 速查
- Qt移动应用开发(七):QML与Java的交互
- 《算法艺术与信息学竞赛》(刘汝佳 黑皮书)在pku等网站上的题目
- POJ 3067 Japan
- hdu 3255 Farming (线段树扫描线球体积并)
- java.util包(二)
- libGDX screen game 多界面游戏
- linux 内存管理3
- 并查集总结
- ELF文件解析之 ELF头 程序头表 节头表-补充之前文章代码 只支持32位 出版