使用JNI时Qt在哪里寻找Java类 [英] Where does Qt look for java classes when using JNI
问题描述
我正在尝试在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!
注意文件路径://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屋!