本文主要描述一种通过间接的方法,使得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文件的方法,创建的文件应该会在项目的一级目录下。下面是一个示例:
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("MySQLConnector");
// 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、编译并运行
最后编译运行试试