龙空技术网

Qt编写Android App,调用Activity获得返回值

散装码农 750

前言:

而今朋友们对“qt调用java库”都比较着重,大家都需要了解一些“qt调用java库”的相关内容。那么小编在网摘上网罗了一些关于“qt调用java库””的相关内容,希望你们能喜欢,朋友们快快来学习一下吧!

对于C++程序员来说使用Qt开发手机app不失为一个好的选择,当Qt不能满足要求时可以调用Android原生代码实现功能,由于Qt的帮助文档有限,相信不少Qt开发者也踩了不少坑

首先创建Qt工程

1.添加Android支持工程pro文件添加

QT += androidextras

2.编写Activity返回值类,派生于QAndroidActivityResultReceiver,实现返回函数handleActivityResult,通过信号SendData将数据抛出去,代码如下:

ActivityResult .h 文件

#ifndef ACTIVITYRESULT_H

#define ACTIVITYRESULT_H

#include <QAndroidActivityResultReceiver>

class ActivityResult : public QObject,public QAndroidActivityResultReceiver

{

Q_OBJECT

signals:

void sendData(QString);

public:

int requestId;

ActivityResult(int id, QObject *parent = nullptr) : QObject(parent), requestId(id) {}

void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);

};

#endif // ACTIVITYRESULT_H

ActivityResult .cpp文件

#include <QDebug>

void ActivityResult::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)

{

if(receiverRequestCode == requestId)

{

if(resultCode ==-1)

{

QAndroidJniObject name=QAndroidJniObject::fromString("select");

QAndroidJniObject str = data.callObjectMethod("getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;",name.object<jstring>());

if(str==NULL)

{

emit sendData(tr("返回为空"));

return;

}

str.toString();

emit sendData(str.toString());

return;

}

else

{

//some code here

}

}

}

QT端调用代码

//调用Activity

void MainWindow::on_pushButton_clicked()

{

ActivityResult *m_ActivityResult;

QAndroidJniEnvironment env;

if(m_ActivityResult!=NULL)

{

delete m_ActivityResult;

}

m_ActivityResult = new ActivityResult(0);

connect(m_ActivityResult,SIGNAL(sendData(QString)),this,SLOT(sendData(QString)));//连接信号获得返回值

QtAndroid::runOnAndroidThread([=](){

QAndroidJniObject action = QAndroidJniObject::fromString("org.qtproject.example.HelloWindow.XNActivity");//通用调用名称为org.qtproject.example.HelloWindow.XNActivity 保持和Java中要调用的Activity一致

QAndroidJniObject intent("android/content/Intent","(Ljava/lang/String;)V", action.object<jstring>());

QtAndroid::startActivity(intent, 0, m_ActivityResult);

});

}

void MainWindow::sendData(QString str)

{

QMessageBox::information(NULL, tr("提示"), str,QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//弹窗显示返回的值

}

编译该工程将产生build-工程目录

用Android Studio打开该目录下的android-build

添加要调用的Activity

activity在AndroidManifest.xml中定义

<activity android:name=".XNActivity">

<intent-filter>

<action android:name="org.qtproject.example.HelloWindow.XNActivity"/> <!--一定要指定通过名称调用-->

<category android:name="android.intent.category.DEFAULT"/><!--一定要指定默认值-->

</intent-filter>

</activity>

XNActivity布局代码

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=";

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ff0000ff"

>

<Button

android:layout_width="match_parent"

android:text="@string/click"

android:layout_height="wrap_content"

android:id="@+id/mybt"

/>

</LinearLayout>

XNActivity.Java代码

package org.qtproject.example.HelloWindow;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import org.qtproject.qt5.android.bindings.QtActivity;

public class XNActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_xn);

findViewById(R.id.mybt).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent =new Intent(XNActivity.this, QtActivity.class);

intent.putExtra("select","123中华民族");//返回数据

setResult(Activity.RESULT_OK,intent);

finish();//结束当前Activity,返回上一个activity

}

});

}

}

现在再次编译工程运行,可以看到Activity返回串"123中华民族"

为避免Qt Java不不同数据类型转换的麻烦,可以采用传递json串方式解决

感谢你的支持下节将介绍使用Qt直接调用Java类

标签: #qt调用java库 #qt调用java代码 #qt 调用java #qt 调用java 腾讯云