You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android Studio中通过CMake原生C++运行QApplication求助

在Android Studio中通过CMake集成Qt的问题排查与解决方案

操作流程与代码实现

我尝试在Android Studio中结合CMake使用Qt,操作步骤为:先创建一个原生C++项目,随后修改了CMakeLists.txt、导出的JNI函数以及MainActivity类,具体代码如下:

CMakeLists.txt

cmake_minimum_required(VERSION 3.18.1)

project("cpp_trial")

set(CMAKE_FIND_ROOT_PATH "/home/yskj/Qt/5.15.2/android")

set(CMAKE_AUTOMOC YES)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets)

add_library(cpp_trial SHARED native-lib.cpp window.cpp)

find_library(log-lib log)

target_link_libraries(cpp_trial ${log-lib} Qt::Widgets Qt::Core Qt::Gui)

JNI导出函数(native-lib.cpp)

#include <jni.h>
#include <string>
#include <QApplication>
#include "window.h"

extern "C" JNIEXPORT jint JNICALL
Java_com_example_cpp_1trial_MainActivity_stringFromJNI(
    JNIEnv* env,
    jobject ) {
 int argc =1;
 char* argv[]={"dummy"};
 QApplication app(argc,argv);
 Dialog diag;
 diag.showMaximized();
 return app.exec();
}

MainActivity.kt

package com.example.cpp_trial
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.cpp_trial.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        stringFromJNI()
    }

    external fun stringFromJNI(): Int

    companion object {
        init {
            System.loadLibrary("cpp_trial")
        }
    }
}

关键问题排查与修复建议

作为Android开发新手,在网上未找到相关解决方案,以下是针对该场景的核心问题修复点:

  • Qt Android路径匹配:CMAKE_FIND_ROOT_PATH需指向对应ABI的Qt目录,而非Android根目录。例如针对arm64-v8a架构,路径应改为/home/yskj/Qt/5.15.2/android_arm64_v8a,否则CMake无法正确找到对应架构的Qt库。
  • Qt元对象编译(MOC):确保window.h中包含Q_OBJECT宏,否则CMAKE_AUTOMOC无法生成必要的元对象代码,会导致链接错误。若头文件未被自动识别,可手动添加qt5_wrap_cpp(MOC_SOURCES window.h)并将MOC_SOURCES加入add_library的源文件列表。
  • 主线程阻塞问题:QApplication::exec()会阻塞当前线程,而onCreate运行在Android主线程,这会导致Activity生命周期卡死。应将Qt UI逻辑移至独立线程,或使用Qt官方的Android集成方案(通过Qt Creator生成Android项目后导入Android Studio)。
  • Qt库打包:需将Qt的共享库(如libQt5Core.so、libQt5Widgets.so等)复制到项目的src/main/jniLibs/<ABI>目录下,或通过Gradle配置自动引入,否则APK运行时会因找不到Qt库崩溃。
  • 环境变量配置:在项目的local.properties中添加qt.dir=/home/yskj/Qt/5.15.2/android_arm64_v8a,确保Gradle能正确识别Qt环境。

内容的提问来源于stack exchange,提问作者wangz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:55:24