我正在尝试在 Qt 中使用 JNI。我想知道我应该把java类放在哪里。互联网上有很多关于 JNI 的帖子,但他们假设您知道将类放在哪里,并且只展示如何调用方法。
我发现必须设置变量:ANDROID_PACKAGE_SOURCE_DIR。我设置了这个变量,但它不起作用。
我在项目根文件夹中有一个文件夹android。我的文件树是这样的:
-root-project
-android
-app1
-MyJavaClass.class
-MyJavaClass.java
该类具有以下包:package app1;
在 .pro 文件中,我尝试过以下操作:
android{
QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
}
还有这个:
android{
QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR=$$PWD/android
}
我正在尝试以这种方式使用该类:
int AccessLocalData::fibonacci(int n) {
return QAndroidJniObject::callStaticMethod<jint>("app1/MyJavaClass", "fibonacci", "(I)I", n);
}
我发现的更好的帖子是这些:
Using Qt/C++ to call Java code through JNI. FindClass does not find class
How to use QAndroidJniObject to call Java code from inside Qt?
他们都说要使用 ANDROID_PACKAGE_SOURCE_DIR,但是一旦这对我不起作用,我想我需要更深入地解释整个事情是如何工作的。
抛出的错误是这样的:
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
假设我的 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
最终我会走这条路:
$$PWD/android/src/org.me.mypack
并在我的类中调用静态方法:
QAndroidJniObject::callStaticMethod<void>("org.me.mypack/Utilities",
"requestPermissions",
"(Landroid/app/Activity;)V",
QtAndroid::androidActivity().object());
因此,在您的情况下,您应该创建包路径:
ANDROID_PACKAGE_SOURCE_DIR/src/app1
--> $$PWD/android/src/app1
并将您的 java 类文件 MyJavaClass.java
和该包的其他 java
类放入该路径中。
如果您还没有完成,请查看JNI 速成类(class),它使用与您的示例相同的调用,但使用不同的包!
Extending your Qt Android application using JNI
在示例中记下文件路径://java file android/src/com/kdab/training/MyJavaClass.java
和电话:
return QAndroidJniObject::callStaticMethod<jint>
("com/kdab/training/MyJavaClass" // java class name
, "fibonacci" // method name
, "(I)I" // signature
, n);
关于android - Qt使用JNI时在哪里寻找java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940444/