C:\Users\Eng.Beshoy\Documents\Admob\widget.cpp:12:...
Создано: 26 апреля 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
Создано: 26 апреля 2026 г.
Отвечено с использованием GPT-5.5 Thinking от Chat01
C:\Users\Eng.Beshoy\Documents\Admob\widget.cpp:12: error: 'QNativeInterface' file not found
C:\Users\Eng.Beshoy\Documents\Admob\widget.cpp:12:10: fatal error: 'QNativeInterface' file not found
12 | #include <QNativeInterface>
| ^~~~~~~~~~~~~~~~~~
here is my cmake
cmake_minimum_required(VERSION 3.16)
project(Admob VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
set(PROJECT_SOURCES
main.cpp
widget.cpp
widget.h
widget.ui
)
if({PROJECT_SOURCES}
AdMobBridge.java
)
set_target_properties(Admob PROPERTIES
QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
if(ANDROID)
add_library(Admob SHARED
${PROJECT_SOURCES}
)
textelse() add_executable(Admob ${PROJECT_SOURCES} ) endif()
endif()
if(ANDROID)
set_property(TARGET Admob PROPERTY
QT_ANDROID_PACKAGE_SOURCE_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/android"
)
endif()
target_link_libraries(Admob PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
if({BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION {PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS Admob
BUNDLE DESTINATION .
LIBRARY DESTINATION {CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(Admob)
endif()
The error is not from your CMake syntax. It is because your project is being built with Qt 5 or with an old Qt 6 kit. QNativeInterface is a Qt 6 header, and the Android API you probably want, QNativeInterface::QAndroidApplication, is available since Qt 6.2. Qt documents QNativeInterface as #include <QNativeInterface> since Qt 6.0, and QAndroidApplication::context() since Qt 6.2. (Qt Documentation)
Your CMake currently allows both Qt 6 and Qt 5:
cmakefind_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
So if Qt Creator is using a Qt 5 kit, CMake happily configures Qt 5, then this fails:
cpp#include <QNativeInterface>
Change the top Qt part of your CMake to this:
cmakefind_package(Qt6 6.2 REQUIRED COMPONENTS Core Widgets)
and link Core explicitly:
cmaketarget_link_libraries(Admob PRIVATE Qt6::Core Qt6::Widgets)
So your cleaned-up CMake should look like this:
cmakecmake_minimum_required(VERSION 3.16) project(Admob VERSION 0.1 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.2 REQUIRED COMPONENTS Core Widgets) set(PROJECT_SOURCES main.cpp widget.cpp widget.h widget.ui ) qt_add_executable(Admob MANUAL_FINALIZATION ${PROJECT_SOURCES} ) target_link_libraries(Admob PRIVATE Qt6::Core Qt6::Widgets) if(ANDROID) set_property(TARGET Admob PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" ) endif() set_target_properties(Admob PROPERTIES MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) include(GNUInstallDirs) install(TARGETS Admob BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) qt_finalize_executable(Admob)
In widget.cpp, do not include Android/Qt-native-interface headers unconditionally. Use this:
cpp#include <QtGlobal> #if defined(Q_OS_ANDROID) #include <QJniObject> #include <QNativeInterface> #endif
Then any Android call should also be guarded:
cpp#if defined(Q_OS_ANDROID) QJniObject context = QNativeInterface::QAndroidApplication::context(); // Example: QJniObject::callStaticMethod<void>( "com/your/package/AdMobBridge", "initialize", "(Landroid/content/Context;)V", context.object<jobject>() ); #endif
QJniObject is the Qt 6 JNI wrapper used for calling Java from C++, and Qt’s Android examples use it together with QNativeInterface::QAndroidApplication::context(). (Qt Documentation)
In Qt Creator, make sure you are building with something like:
textQt 6.2+ for Android
not:
textDesktop Qt 5.x MinGW Desktop Qt 6.x MinGW
or:
textAndroid Qt 5.x
For this specific QNativeInterface::QAndroidApplication approach, use Qt 6.2 or newer for Android.
AdMobBridge.javaThis line is probably not useful:
cmakeAdMobBridge.java
Java files for Android should usually live under your Android package source directory, for example:
textandroid/src/com/your/package/AdMobBridge.java
Your CMake already points Qt to that Android folder with:
cmakeQT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
So remove AdMobBridge.java from qt_add_executable() and put it in the correct android/src/... Java package path.