[英]qt 6.3 firebase cpp sdk integration for android(cmake)
所以我一直在尝试将最新的 cpp sdk(9.5) 集成到我的 Qt6 cmake android 应用程序中。 使用的依赖项
openjdk 11
ndk22.1.7171670
gradle 7.4(default from the qt android package template)
我已将整个 sdk 目录放入我的项目中。
这是顶级CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(kushok-client VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(ANDROID)
include(${ANDROID_SDK_ROOT}/android_openssl/CMakeLists.txt)
endif()
find_package(Qt6 COMPONENTS Core REQUIRED)
find_package(Qt6 COMPONENTS Quick REQUIRED)
find_package(Qt6 COMPONENTS Multimedia REQUIRED)
find_package(Qt6 COMPONENTS Gui REQUIRED)
find_package(Qt6 COMPONENTS Network REQUIRED)
find_package(Qt6 COMPONENTS Charts REQUIRED)
find_package(Qt6 COMPONENTS Svg REQUIRED)
find_package(Qt6 COMPONENTS Core5Compat REQUIRED)
find_package(Qt6 COMPONENTS WebSockets REQUIRED)
find_package(Qt6 COMPONENTS LinguistTools REQUIRED)
set(FIREBASE_CPP_SDK_DIR "${CMAKE_CURRENT_LIST_DIR}/libs/firebase_cpp_sdk")
add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL)
add_subdirectory(src/app)
在src/app/CMakeLists.txt
里面
if(ANDROID)
set(ANDROID_PACKAGE_SOURCE_DIR android
CACHE INTERNAL "")
endif()
qt_add_executable(appkushok-client
cpp/core.h cpp/core.cpp
assets/images/images.qrc
assets/images/icons/icons.qrc
assets/fonts/fonts.qrc
cpp/main.cpp
)
target_include_directories(appkushok-client PUBLIC ${INCLUDE_DIR})
qt_add_qml_module(appkushok-client
URI KushokClient
VERSION 1.0
QML_FILES
qml/main.qml
js/utils.js
)
set_target_properties(appkushok-client PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
if(ANDROID)
set_target_properties(appkushok-client PROPERTIES QT_ANDROID_EXTRA_LIBS "${ANDROID_EXTRA_LIBS}")
endif()
target_link_libraries(appkushok-client PRIVATE Qt6::Quick
Qt6::Core
Qt6::Multimedia
Qt6::Gui
Qt6::Network
Qt6::Charts
Qt6::Svg
Qt6::Core5Compat
Qt6::WebSockets
)
set(firebase_libs
firebase_messaging
firebase_auth
firebase_app
)
target_link_libraries(appkushok-client PRIVATE "${firebase_libs}")
target_compile_definitions(appkushok-client
PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
然后我按照这里的说明操作
这是我的 build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.2'
// Add the following lines:
classpath 'com.google.gms:google-services:4.3.14' // Google Services plugin
implementation 'com.google.android.gms:18.1.0'
}
}
repositories {
google()
mavenCentral()
}
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // Google Services plugin
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
android.defaultConfig.externalNativeBuild.cmake {
arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir"
}
# Add the dependencies for the Firebase products you want to use in your app
# For example, to use Firebase Authentication and Firebase Realtime Database
apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
firebaseCpp.dependencies {
auth
database
}
android {
/*******************************************************
* The following variables:
* - androidBuildToolsVersion,
* - androidCompileSdkVersion
* - qtAndroidDir - holds the path to qt android files
* needed to build any Qt application
* on Android.
*
* are defined in gradle.properties file. This file is
* updated by QtCreator and androiddeployqt tools.
* Changing them manually might break the compilation!
*******************************************************/
compileSdkVersion androidCompileSdkVersion.toInteger()
buildToolsVersion androidBuildToolsVersion
ndkVersion androidNdkVersion
// Extract native libraries from the APK
packagingOptions.jniLibs.useLegacyPackaging true
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = [qtAndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qtAndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qtAndroidDir + '/res', 'res']
resources.srcDirs = ['resources']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
tasks.withType(JavaCompile) {
options.incremental = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
abortOnError false
}
// Do not compress Qt binary resources file
aaptOptions {
noCompress 'rcc'
}
defaultConfig {
resConfig "en"
minSdkVersion qtMinSdkVersion
targetSdkVersion qtTargetSdkVersion
ndk.abiFilters = qtTargetAbiList.split(",")
}
}
和设置.gradle
def firebase_cpp_sdk_dir = System.getProperty('firebase_cpp_sdk.dir')
gradle.ext.firebase_cpp_sdk_dir = "$firebase_cpp_sdk_dir"
includeBuild "$firebase_cpp_sdk_dir"
我在 gradle.properties 中硬编码了 firebase cpp sdk 路径以确保它有效
org.gradle.jvmargs=-Xmx2500m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
systemProp.firebase_cpp_sdk.dir=/home/sadeq/projects/kushok/mobile/kiosk-client-app-base/libs/firebase_cpp_sdk
我在我的 android package 目录中添加了 google-services.json 并且我的清单包含此服务
<service android:name=".com.google.firebase.messaging.MessageForwardingService">
<meta-data android:name="android.app.background_running" android:value="true"/>
<meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
</service>
项目编译正常但在运行时崩溃并显示此消息
E firebase: Java class com/google/firebase/FirebaseApp not found. Please verify the AAR which contains the com/google/firebase/FirebaseApp class is included in your app.
E firebase: clazz
F firebase: Java class com/google/firebase/FirebaseApp not found. Please verify the AAR which contains the com/google/firebase/FirebaseApp class is included in your app.
F libc : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 26087 (qtMainLoopThrea), pid 26062 (ppkushok_client)
似乎 firebase java 库未导入,我尝试将 cpp sdk 放入ANDROID_PACKAGE_SOURCE_DIR/libs
中,但它没有任何区别。
我有相同的运行时消息并通过将以下内容添加到 CMakeList.txt 来解决它:
if(ANDROID) set_property(TARGET "your_target_name" APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android ) endif()
在你的情况下,“your_target_name”是 appkushok-client。
并使用 Qt6.3.2 构建。 问题是我的 AndroidManifest.xml 没有复制到构建目录子目录 android-build,而是来自 Qt 的默认目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.