欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Qt6.7 开发 Android 程序间接连接 MySQL 的方法

最编程 2024-09-30 07:17:04
...

本文主要描述一种通过间接的方法,使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库,然后C++代码去调用JAVA的方法,从而实现QT开发的安卓程序去直连到MySQL数据库。
本文使用 JDBC 结合 JNI(Java Native Interface)的方案。因为 Android 原生支持 Java,可以通过 JNI 机制让你的 C++ 代码调用 Java 中的 JDBC API。

1. 总体流程概述

  1. 设置 Android 项目环境,集成 MySQL JDBC 驱动,配置 AndroidManifest.xml;
  2. 编写 Java 代码用于 JDBC 连接;
  3. 将 Java 方法暴露给 C++ 代码(JNI)
  4. 编译并运行

2. 设置 Android 项目环境,集成 MySQL JDBC 驱动

2.1 设置 Android 项目环境

首先,在 Qt 项目中设置好 Android 开发环境,并确保 Android SDK 和 NDK 正确配置。
需要确保在QT项目中存在**“android”文件夹**。可以参考下面方式进行添加:
在这里插入图片描述
在这里插入图片描述
最后在项目目录下应该会生成一个“android”文件夹。

2.2 集成 MySQL JDBC 驱动

为了让 JDBC 工作,你需要将 MySQL 的 JDBC 驱动包含在 Android 应用中。你可以从 MySQL 官方网站下载 JDBC 驱动,并将 mysql-connector-java-X.X.X.jar 添加到 Android 项目中。

  1. 选择版本:选择合适的 MySQL Connector/J 版本(例如 8.0),通常建议使用最新稳定版本。
  2. 选择操作系统时的选项:在下载页面,操作系统部分选择 “Platform Independent”(平台无关),因为它是 Java 实现,不依赖于具体操作系统。
  3. 下载 .zip 或 .tar.gz 文件:下载后会得到一个压缩包,解压后你就能找到 mysql-connector-java-X.X.X.jar 文件。
  4. 集成到项目中:将 .jar 文件放入你的 Android 项目的 libs 文件夹;如果没有libs文件夹,可以手动创建一个。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 在build.gradle 中配置依赖项:查看android文件夹下“build.gradle”文件中的依赖项,存在这样语句“implementation fileTree(dir: ‘libs’, include: [‘.jar’, '.aar’])”通常不需要额外操作。否则需要手动添加:implementation files(‘libs/mysql-connector-java-X.X.X.jar’)
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    implementation 'androidx.core:core:1.13.1'
}

2.3 配置 AndroidManifest.xml

在 AndroidManifest.xml 文件中,需要声明应用权限来访问网络:
在这里插入图片描述

3. 编写 Java 代码用于 JDBC 连接

需要在 Android 的 Java 部分编写用于连接 MySQL 的 JDBC 代码。
使用qt项目中创建JAVA文件的方法,把目标文件放到“android/src/com”目录下(具体可参考JAVA包目录设置情况进行设置)。没有对应文件夹手动创建即可。
在这里插入图片描述
在这里插入图片描述
添加完成后,在.pro文件中应该会自动添加这个内容:

DISTFILES += \
    android/src/com/MysqlConnector.java

下面是一个JAVA代码调用mysql的示例:

package com.MysqlConnector;		// 注意,不确定这里缺失会不会有问题

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class MySQLConnector {
    private static final String url = "jdbc:mysql://<your_mysql_host>:<port>/<database>";
    private static final String user = "<your_mysql_user>";
    private static final String password = "<your_mysql_password>";

    public String getData() {
        String result = "";
        try {
            // 加载 MySQL JDBC 驱动
            // Class.forName("com.mysql.jdbc.Driver");		// 自测试不要这个也能正常运行

            // 建立连接
            Connection conn = DriverManager.getConnection(url, user, password);

            // 创建 Statement 对象
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");

            // 处理结果集
            while (rs.next()) {
                result += rs.getString("your_column") + "\n";
            }

            // 关闭连接
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

4. 将 Java 方法暴露给 C++ 代码(JNI)

在 Qt 项目中,创建一个 C++ 文件 jni_interface.cpp,用于定义调用 Java 的 JNI 接口:

#include <QJniObject>
#include <QJniEnvironment>
#include <jni.h>
#include <QDebug>

int getMySQLData() {
    // Step 1: 获取 Java 类的引用
    QJniObject javaClass("com/MySQLConnector/MySQLConnector");		//注意路径
    if ( !javaClass.isValid() ) {
        qDebug() << "Java 类加载失败";
        return -2;
    }

    // Step 3: 调用 Java 方法
    jint result = javaClass.callMethod<jint>(
        "getData",                // Java 方法名
        "()Ljava/lang/String;"  // 方法签名
    );

    // 检查 JNI 调用是否有异常
    QJniEnvironment env;
    if (env->ExceptionCheck()) {
        env->ExceptionClear();
        qWarning() << "JNI 调用失败";
        return -1;
    }

    return result; // 返回 Java 方法的结果
}

最后在自己业务代码处调用该方法。

5、编译并运行

最后编译运行试试

推荐阅读