使用JNI时Qt在哪里寻找Java类 [英] Where does Qt look for java classes when using JNI

查看:216
本文介绍了使用JNI时Qt在哪里寻找Java类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Qt中使用JNI.我想知道我应该把java类放在哪里.互联网上有许多有关JNI的帖子,但它们假定您知道将类放在哪里,仅显示如何调用方法.

I'm trying to use JNI in Qt. I would like to know where should I put the java classes. There are many posts about JNI on the internet, but they assume you know where to put the classes and only show how to call the methods.

我发现必须设置变量:ANDROID_PACKAGE_SOURCE_DIR.我设置了这个变量,但是没有用.

I found that the variable: ANDROID_PACKAGE_SOURCE_DIR must be set. I set this variable, but it didn't work.

我在项目根文件夹中有一个android文件夹.我的文件树是这样的:

I have a folder android in the project root folder. My files tree is something like this:

-root-project
    -android
        -app1
            -MyJavaClass.class
            -MyJavaClass.java

该班级有这个礼包:package app1;

在.pro文件中,我已经尝试过:

In the .pro file, I've tried this:

android{
    QT += androidextras
    ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
}

和这个:

android{
    QT += androidextras
    ANDROID_PACKAGE_SOURCE_DIR=$$PWD/android
}

我正在尝试以这种方式使用该类:

I'm trying to use the class in this way:

int AccessLocalData::fibonacci(int n) {
    return QAndroidJniObject::callStaticMethod<jint>("app1/MyJavaClass", "fibonacci", "(I)I", n);
}

我发现的更好的帖子是这些:

The better posts I found were these:

使用Qt/C ++通过JNI调用Java代码. FindClass找不到类

如何使用QAndroidJniObject调用Java是Qt内部的代码吗?

他们两个都说要使用ANDROID_PACKAGE_SOURCE_DIR,但是一旦这对我不起作用,我想我需要对这件事的工作原理进行更深入的解释.

Both of them said to use ANDROID_PACKAGE_SOURCE_DIR, but once this didn't work for me, I think I need a deeper explanation of how this whole thing works.

抛出的错误是这样的:

W System.err: java.lang.ClassNotFoundException: Didn't find class "app1.MyJavaClass" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
W System.err:   at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
W System.err:   at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
W System.err:   Suppressed: java.lang.ClassNotFoundException: Didn't find class "app1.MyJavaClass" on path: DexPathList[[zip file "/data/app/org.qtproject.example.INF628-1/base.apk"],nativeLibraryDirectories=[/data/app/org.qtproject.example.INF628-1/lib/arm, /data/app/org.qtproject.example.INF628-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
W System.err:       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
W System.err:       at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
W System.err:       at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
W System.err:       ... 1 more
W System.err:       Suppressed: java.lang.ClassNotFoundException: app1.MyJavaClass
W System.err:           at java.lang.Class.classForName(Native Method)
W System.err:           at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
W System.err:           at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
W System.err:           at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
W System.err:           ... 2 more
W System.err:       Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

推荐答案

它们应位于ANDROID_PACKAGE_SOURCE_DIR下的src文件夹中. 可以说我有一个java软件包org.me.mypack,然后我要做的是在以下目录下为该软件包创建FQ路径: ANDROID_PACKAGE_SOURCE_DIR/src

They should reside in src folder under your ANDROID_PACKAGE_SOURCE_DIR. Lets say I have a java package org.me.mypack , then what I do is create the FQ path for the package under: ANDROID_PACKAGE_SOURCE_DIR/src

假设我的ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

最终,我将具有以下路径:

eventually I will have this path:

$$PWD/android/src/org.me.mypack

并在我的课程中调用静态方法:

and call a static method in my class:

QAndroidJniObject::callStaticMethod<void>("org.me.mypack/Utilities",
                                        "requestPermissions",
                                        "(Landroid/app/Activity;)V",
                                        QtAndroid::androidActivity().object());

因此,在您的情况下,您应该创建包路径:

So in your case, you ought to create your package path:

ANDROID_PACKAGE_SOURCE_DIR/src/app1-> $$PWD/android/src/app1

,然后将包的Java类文件MyJavaClass.java和其他java类放在该路径中.

and put your java class file MyJavaClass.java and other java classes for the package in that path.

如果还没有完成,请检查 JNI速成课程,该课程使用与您的示例相同的调用,但使用了不同的软件包!

If you haven't already done, check JNI Crash Course, which uses same call as your example, but with different package!

使用JNI扩展您的Qt Android应用程序

注意文件路径://java file android/src/com/kdab/training/MyJavaClass.java 和通话:

in the example note the file path: //java file android/src/com/kdab/training/MyJavaClass.java and the call:

return QAndroidJniObject::callStaticMethod<jint>
 ("com/kdab/training/MyJavaClass" // java class name
 , "fibonacci" // method name
 , "(I)I" // signature
 , n);

这篇关于使用JNI时Qt在哪里寻找Java类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆