ClassNotFoundException При вызове Custom Java Class из QT для Android с помощью JNIC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 ClassNotFoundException При вызове Custom Java Class из QT для Android с помощью JNI

Сообщение Anonymous »

Я разрабатываю приложение для Android с использованием QT 6.9, которое необходимо для сканирования Wi -Fi Networks. Я создал пользовательский класс Java для обработки сканирования Wi-Fi, но когда я пытаюсь назвать его из C ++, используя QJniObject, я получаю ClassNotFoundException.
ошибка:

W/default : java.lang.ClassNotFoundException: Didn't find class "org.qtproject.example.WifiScanner" on path: DexPathList[[zip file "/data/app/~~UP-gr_qyeyNz7-Yy5qowag==/org.qtproject.example.appble_demo-EXVcLfqQlNUZsaYXDEE0KQ==/base.apk"],nativeLibraryDirectories=[/system/lib64, /system_ext/lib64]]
... [stack trace] ...
D/default : Scan failed or no networks found
< /code>
Ключевые факты: < /strong> < /p>
  • APK не содержит моего Wifiscanner.java class < /li>
    Я подтвердил класс Java, который существует в моем проекте < /li>
    qt версия: 6.9 < /li>

    System

среда


[*] Windows 11 23h2 Pro
[*] qt 6.9 с qt creator 16.0.2
[*] sdk: android-35 (api level 35) [*] android: android-35 (api 35) [*]
[*] Android sdk: android-35 (api 35)
[*] Android. /> Build: Clang, Arm64-V8a, Debug < /li>
ndk: 27.2.12479018 < /li>
< /ul>
Детали окружающей среды < /p>
Проектная структура: < /strong> < /p>

структура проекта: < /strong> < /p>

Код: Выделить всё

project-root/
├── android/
│   ├── src/
│   │  └── org/
│   │       └── qtproject/
│   │           └── example/
│   │               └── WifiScanner.java
│   ├── res/
│   └── AndroidManifest.xml
├── CMakeLists.txt
├── main.cpp
└── ...  (other files) ...
project-root image
sstrong>cmakelists.txt[/b]образное

Код: Выделить всё

cmake_minimum_required(VERSION 3.16)

project(hs_app VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 REQUIRED COMPONENTS Quick Bluetooth Core)

qt_standard_project_setup(REQUIRES 6.8)

qt_add_executable(appble_demo
main.cpp
)

qt_add_qml_module(appble_demo
URI ble_demo
VERSION 1.0
QML_FILES
Main.qml
RESOURCES res/img.qrc
QML_FILES BleDev.qml
SOURCES bledevlistmodel.h bledevlistmodel.cpp
SOURCES wifiListModel.h wifiListModel.cpp
RESOURCES android/src/org/qtproject/example/WifiScanner.java
RESOURCES android/AndroidManifest.xml android/build.gradle android/res/values/libs.xml android/res/xml/qtprovider_paths.xml
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appble_demo PROPERTIES
#    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appble_demo
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)

target_link_libraries(appble_demo
PRIVATE Qt6::Quick
Qt${QT_VERSION_MAJOR}::Bluetooth #添加蓝牙
Qt6::Core
)

include(GNUInstallDirs)
install(TARGETS appble_demo
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
android manifest.xml build.gradle

Код: Выделить всё

buildscript {
repositories {
google()
mavenCentral()
}

dependencies {
//noinspection AndroidGradlePluginVersion
classpath 'com.android.tools.build:gradle:8.8.0'
}
}

repositories {
google()
mavenCentral()
}

apply plugin: qtGradlePluginType

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
//noinspection GradleDependency
implementation 'androidx.core:core:1.13.1'
}

android {
/*******************************************************
* The following variables:
* - androidBuildToolsVersion,
* - androidCompileSdkVersion
* - qtAndroidDir - holds the path to qt android files
*                   needed to build any Qt application
*                   on Android.
* - qtGradlePluginType - whether to build an app or a library
*
* are defined in gradle.properties file.  This file is
* updated by QtCreator and androiddeployqt tools.
* Changing them manually might break the compilation!
*******************************************************/

namespace androidPackageName
compileSdkVersion androidCompileSdkVersion
buildToolsVersion androidBuildToolsVersion
ndkVersion androidNdkVersion

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(",")
}
}
wifiscanner.java

Код: Выделить всё

package org.qtproject.example;

import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.util.Log;
import org.qtproject.qt.android.QtNative;

import java.util.List;

public class WifiScanner {
private static final String TAG = "WifiScanner";

public static String[] scanWifiNetworks() {
//mycode...
}
c ++ Code
void wifiListModel::scanWifi()
{

// 调用 Java 静态方法
QJniObject resultArray = QJniObject::callStaticObjectMethod(
"org/qtproject/example/WifiScanner",
"scanWifiNetworks",
"()[Ljava/lang/String;" // JNI 签名:返回 String 数组
);
//QJniObject resultArray = WFSCAN::callStaticMethod("scanWifiNetworks");

if (resultArray.isValid()) {
jobjectArray arr = static_cast(resultArray.object());
QJniEnvironment env;
int len = env->GetArrayLength(arr);

for (int i = 0; i < len; i += 3) {
QJniObject ssid = env->GetObjectArrayElement(arr, i);
QJniObject level = env->GetObjectArrayElement(arr, i + 1);
QJniObject security = env->GetObjectArrayElement(arr, i + 2);

qDebug()

Подробнее здесь: https://stackoverflow.com/questions/796 ... roid-using
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»