Qt6.7开发安卓程序间接连接到MySQL的方法
本文主要描述一种通过间接的方法,使得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、编译并运行
最后编译运行试试
相关文章:

Qt6.7开发安卓程序间接连接到MySQL的方法
本文主要描述一种通过间接的方法,使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库,然后C代码去调用JAVA的方法,从而实现QT开发的安卓程序去直连到MySQL数据库。 本文使用 JDBC 结合 JNI&…...

ROW_NUMBER
How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…...

Docker技术
目录 Docker的基本概念 Docker的核心原理 Docker的使用场景 Docker的优点 Docker的挑战 为什么使用 环境一致性 快速启动和部署 资源利用率高 支持微服务架构 持续集成与持续交付(CI/CD) 依赖管理 简化部署流程 高效资源管理 生态系统丰富…...

中小企业做网站需要考虑哪些因素?
中小企业在建设网站时,需要考虑的因素有很多。以下是一些主要考虑因素的介绍: 明确建站目的:中小企业需要明确自己建立网站的目的。是为了展示企业形象、推广产品,还是提供客户服务?不同的目的将决定网站的设计和功能…...

【d60】【Java】【力扣】509. 斐波那契数
思路 要做的问题:求F(n), F(n)就等于F(n-1)F(n-2),要把这个F(n-1)F(n-2)当作常量,已经得到的值, 结束条件:如果是第1 第2 个数字的时候,没有n-1和n-2,所以…...

项目-坦克大战学习-游戏结束
当boos受到伤害时游戏结束,游戏结束时我们需要将窗体全部绘制从别的画面,这样我们可以在游戏运行类中的update设置条件,在游戏运行类thread创建一个枚举类型定义是否游戏结束 public enum Game { play, over };//定义现在游戏运行状态 如果…...

MySQL基础之约束
MySQL基础之约束 概述 概念:约束是作用在字段的规则,限制表中数据 演示 # 多个约束之间不需要加逗号 # auto_increment 自增 create table user(id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age i…...

2024新版IDEA创建JSP项目
1. 创建项目 依次点击file->new->Project 配置如下信息并点击create创建项目 2. 配置Web项目 点击file->Project Structure 在点击Project Settings->Module右键右边模块名称->ADD->Web 点击Create Artifact 出现如下界面就表示配置完毕,…...

Conda创建,打包,删除环境相关及配置cuda
conda创建新环境Anaconda删除虚拟环境conda删除环境conda环境打包迁移及部署Python | Conda pack 进行环境打包Anaconda创建环境、删除环境、激活环境、退出环境Anaconda环境离线迁移_CondaPackError处理Anaconda环境离线迁移移植Anaconda-用conda创建python虚拟环境anaconda 配…...

Linux和指令初识
前言 Linux是我们在服务器中常用的操作系统,我们有必要对这个操作系统有足够的认识,并且能够使相关的指令操作。今天我们就来简单的认识一下这个操作的前世今生,并且介绍一些基础的指令操作 Linux的前世今生 要说Linux,还得从U…...

Vortex GPGPU的github流程跑通与功能模块波形探索(二)
文章目录 前言一、环境配置和debugging.md文档1.1 调试 Vortex GPU1.1.1测试 RTL 或模拟器 GPU 驱动的更改1.1.2 SimX 调试1.1.3 RTL 调试1.1.4 FPGA 调试1.1.5 分析 Vortex 跟踪日志 二、跑出波形文件和日志文件总结 前言 昨天另辟蹊径地去探索了子模块的波形仿真,…...

【X线源】微焦点X射线源的基本原理
【X线源】微焦点X射线源的基本原理 1.背景2.原理 1.背景 1895年11月8日,德国物理学家威廉伦琴在研究阴极射线时偶然发现了X射线。当时,他注意到阴极射线管附近的荧光屏发出了光,即使它被纸板遮挡住。经过进一步实验,他意识到这种…...

LeetCode hot100---栈专题(C++语言)
1、有效的括号 (1)题目描述以及输入输出 (1)题目描述: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。(2)输入输出描述: 输入:s "()&…...

STM32-MPU6050+DAM库源码(江协笔记)
目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器࿱…...

Ruby 数组(Array)
Ruby 数组(Array) 引言 Ruby,作为一种高级编程语言,以其简洁明了的语法和强大的功能而闻名。在Ruby中,数组(Array)是一种基本的数据结构,用于存储一系列有序的元素。本文将深入探讨…...

分享几个做题网站------学习网------工具网;
以下是就是做题网站;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台,汇集互联网大厂面试真题,拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库,提供能力测评、面试刷题、笔…...

Spring MVC__入门
目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、helloworld1、开发环境2、创建maven工程3、配置web.xml4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorld7、总结 一、SpringMVC简介 1、什么是MVC MV…...

MATLAB GUI组件全解析:构建交互式应用程序
MATLAB的图形用户界面(GUI)是一个功能强大的工具,它允许开发者创建直观且用户友好的界面。这些界面,也称为应用程序或app,提供了点击控制,使得用户无需学习编程语言或输入命令即可运行应用程序。本文将详细…...

MySQL 实验 2:数据库的创建与管理
MySQL 实验 2:数据库的创建与管理 目录 MySQL 实验 2:数据库的创建与管理一、查看数据库1、语法2、举例 二、创建数据库1、语法2、举例 三、选择数据库1、语法2、举例 四、删除数据库1、语法2、举例 一、查看数据库 1、语法 show databases;2、举例 m…...

LeetCode 2390. 从字符串中移除星号【栈】1347
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

springboot文件上传(阿里云oss)
本地存储 使用uuid是为了避免文件名的重复,防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …...

Linux下Nodejs应用service配置
Linux 的 service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等。service 命令本身是一个 shell 脚本,它在…...

设计模式-结构型-常用:代理模式、桥接模式、装饰者模式、适配器模式
代理模式 快速入门 代理模式是指在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。 比如这段统计性能的代码: public class UserController {//...省略其他属性和方法...private MetricsCollecto…...

用多了编程工具,还是Editplus3最贴心
编程久了,发现越是复杂的编程工具越是烦人,而不是帮助人。 早期Java届是没有统一的IDE的,有些人习惯用文本编辑器,但苦于缺乏提示,有些人从一些渠道用上了JBuilder,但毛病不少,直到Eclipse化解…...

Angular基础学习(入门 --> 入坑)
目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 (ViewChild) 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …...

吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)
目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥?10、…...

Linux防火墙-常用命令
作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...

C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric> 遍历算法: for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...

Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...

Flutter笔记--通知
这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...