【问题标题】:Class not found exception while trying to call Java code in a QT project尝试在 QT 项目中调用 Java 代码时找不到类异常
【发布时间】:2020-09-19 21:56:27
【问题描述】:

我正在尝试在 Android 应用程序的 QT Creator 项目中使用一些用 Java 编写的代码。我的最终目标是在这个项目中使用使用 Android Studio 创建的类和方法。

为了测试我是否理解 QT Java 包装类,我从 Android Studio 创建了一个 Java 类:

文件>>新模块>>Android库>>完成

在这个库中我创建了一个类如下:

package com.example.testclass;

public class MyJavaClass {
   public static int fibonacci (int n){
       if (n <2)
           return n;
       return fibonacci(n-1) + fibonacci(n-2);
   }
}

然后'构建>>制作模块'

在我的 QT 项目 .pro 文件中,我添加了:QT += androidextras 并复制了 .aar 文件(还尝试解压缩并复制 .jar strong> 文件 - 同样尝试将 ...\testclass\src\main 复制到我的项目文件中的 javalib\ 目录。 现在,我尝试了很多方法来使这个文件对我的项目可见。我通过添加编辑 .pro 文件:

OTHER_FILES += \
    javalib/java/com/example/testclass/MyJavaClass.java \
    javalib/AndroidManifest.xml

我尝试通过项目中已经存在的 gradle 文件和其他一些我不记得的东西来添加文件。

但仍然遵循代码从“MyJavaClass”调用“fibonacci”方法;

void MainWindow::on_javaButton_clicked()
{
    int fibo = QAndroidJniObject::callStaticMethod<jint>("com/example/testclass/MyJavaClass", "fibonacci", "(I)I", 5);
    qDebug() << "JAVA OUTPUT: " << fibo << endl;
}

在运行时抛出类未找到异常:

W System.err: java.lang.ClassNotFoundException: Didn't find class "com.example.testclass.MyJavaClass" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib64, /system/vendor/lib64]]
W System.err:   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
W System.err:   at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
W System.err:   at org.qtproject.qt5.android.QtNative$7.run(QtNative.java:390)
W System.err:   at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61)
W System.err:   at java.lang.Thread.run(Thread.java:764)
D libBlueToothTest.so: JAVA OUTPUT:  0

我尝试使用来自 QT 网站和其他来源(如 https://www.qtdeveloperdays.com/sites/default/files/BogdanVatra_Extending_Qt_Android_Apps_with_JNI.pdf)的文档。

我是 QT、Android 和 Java 的新手。 尽管有文档和示例,但我仍在为此苦苦挣扎,如果能提供任何帮助,我将不胜感激。

我现在的 .pro 文件:

QT       += core gui bluetooth androidextras

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    BlueTooth/BlueToothManager.cpp \
    BlueTooth/bluetoothclient.cpp \
    BlueTooth/bluetoothserver.cpp \
    main.cpp \
    mainwindow.cpp \

HEADERS += \
    BlueTooth/BlueToothManager.h \
    BlueTooth/bluetoothclient.h \
    BlueTooth/bluetoothserver.h \
    mainwindow.h \

FORMS += \
    mainwindow.ui

OTHER_FILES += \
    javalib/java/com/example/testclass/MyJavaClass.java \
    javalib/AndroidManifest.xml

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

DISTFILES += \
    android/AndroidManifest.xml \
    android/build.gradle \
    android/gradle/wrapper/gradle-wrapper.jar \
    android/gradle/wrapper/gradle-wrapper.properties \
    android/gradlew \
    android/gradlew.bat \
    android/res/values/libs.xml

contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
    ANDROID_PACKAGE_SOURCE_DIR = \
        $$PWD/android
}

我现在的 gradle 文件:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }
}

repositories {
    google()
    jcenter()
}

apply plugin: 'com.android.application'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}

android {
    /*******************************************************
     * The following variables:
     * - androidBuildToolsVersion,
     * - androidCompileSdkVersion
     * - qt5AndroidDir - 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

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
            aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
            res.srcDirs = [qt5AndroidDir + '/res', 'res']
            resources.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
       }
    }

    lintOptions {
        abortOnError false
    }
}

【问题讨论】:

    标签: java android c++ qt jar


    【解决方案1】:

    好吧,我在这方面工作的时间太长了。经过大量的试验和错误,我终于找到了解决这个问题的方法。 Java 和 C++ 端的代码有任何问题。问题出在 gradle 或 AndroidManifest 文件中。

    -我将 ...\AndroidStudioProjects\qtTest\testclass\src\main\java 文件(包含按照 Java 代码中的“包”关键字以及 .java 源文件的连接文件夹)到我的 Android 包目录,在我的例子中是 android\(见下一步)

    -要从 QT 项目中调用 Java 方法和类,您需要在 .pro 文件中添加一个 android 包目录(我在底部已经有一个,它只指向我的项目目录中的“android”文件夹)。我不知道该文件在开始时包含的确切内容。我认为这是关于包装 C++ 代码以构建适用于 Android 的程序。总之……

    -下一步是为程序准备一个正确的模板。 项目>>构建步骤>>构建 Android APK>>创建模板 带您进入模板向导,该向导已经有一个从 .pro 文件中获取的包源目录。我没有取消勾选“将 Gradle 文件复制到 Android 目录”,但我不知道它是否有任何区别。

    -覆盖所有向导要求您的内容。

    瞧,在代码正常运行后进行一次干净的构建!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2017-05-28
      相关资源
      最近更新 更多