本文主要描述一种通过间接的方法,使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库,然后C++代码去调用JAVA的方法,从而实现QT开发的安卓程序去直连到MySQL数据库。
本文使用 JDBC 结合 JNI(Java Native Interface)的方案。因为 Android 原生支持 Java,可以通过 JNI 机制让你的 C++ 代码调用 Java 中的 JDBC API。
1. 总体流程概述
- 设置 Android 项目环境,集成 MySQL JDBC 驱动,配置 AndroidManifest.xml;
- 编写 Java 代码用于 JDBC 连接;
- 将 Java 方法暴露给 C++ 代码(JNI)
- 编译并运行
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 项目中。
- 选择版本:选择合适的 MySQL Connector/J 版本(例如 8.0),通常建议使用最新稳定版本。
- 选择操作系统时的选项:在下载页面,操作系统部分选择 “Platform Independent”(平台无关),因为它是 Java 实现,不依赖于具体操作系统。
- 下载 .zip 或 .tar.gz 文件:下载后会得到一个压缩包,解压后你就能找到 mysql-connector-java-X.X.X.jar 文件。
- 集成到项目中:将 .jar 文件放入你的 Android 项目的 libs 文件夹;如果没有libs文件夹,可以手动创建一个。
在这里插入图片描述
- 在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、编译并运行
最后编译运行试试