前言:
而今朋友们对“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 腾讯云