【问题标题】:Can’t create java class by QAndroidJniObject无法通过 QAndroidJniObject 创建 java 类
【发布时间】:2014-01-01 01:14:34
【问题描述】:

尝试从 c++ 端创建一个 java 类,但总是崩溃

appBucksAdv.java

package adv;

import org.qtproject.qt5.android.bindings.QtApplication;
import org.qtproject.qt5.android.bindings.QtActivity;

import android.os.Bundle;

public class appBucksAdv extends QtActivity
{
}

simpleJNI.hpp

#include <QObject>
#include <QtAndroidExtras/QAndroidJniObject>

class simpleJNI : public QObject
{
Q_OBJECT
public:
explicit simpleJNI(QObject *parent = nullptr);

private:
QAndroidJniObject advClass_;

};

simpleJNI.cpp

#include "simpleJNI.hpp"

simpleJNI::simpleJNI(QObject *parent) :
QObject(parent),
advClass_("adv/appBucksAdv") //crash when I create the java class
{
}

错误信息: # W/dalvikvm(21397):dvmFindClassByName 拒绝 'org/qtproject/qt5/android/QtMessageDialogHelper'

# D/dalvikvm(21397): 试图加载 lib /data/data/org.qtproject.example.androidTest/lib/libQt5QuickParticles.so 0x4176efd0

# D/dalvikvm(21397):共享库“/data/data/org.qtproject.example.androidTest/lib/libQt5QuickParticles.so”已加载到相同的 CL 0x4176efd0

# D/dalvikvm(21397): 试图加载 lib /data/data/org.qtproject.example.androidTest/lib/libandroidTest.so 0x4176efd0

# D/dalvikvm(21397):添加共享库 /data/data/org.qtproject.example.androidTest/lib/libandroidTest.so 0x4176efd0

# D/dalvikvm(21397):在 /data/data/org.qtproject.example.androidTest/lib/libandroidTest.so 0x4176efd0 中找不到 JNI_OnLoad,跳过初始化

# W/Qt (21397): kernel/qcoreapplication.cpp:416 (QCoreApplicationPrivate::QCoreApplicationPrivate(int&, char**, uint)): 警告: QApplication 不是在 main() 线程中创建的。

# W/dalvikvm(21397):dvmFindClassByName 拒绝 'org/qtproject/qt5/android/QtNativeInputConnection'

# W/dalvikvm(21397):dvmFindClassByName 拒绝 'org/qtproject/qt5/android/QtExtractedText'

1.full messages

2.codes

【问题讨论】:

  • 我建议将相关的错误消息内联起来,使其自成一体。
  • 你也尝试过一些非自定义的java类吗?
  • 只尝试了java的String类,示例自带Qt5.2(Qt-notifier),效果很好。我的最终目标是制作插页式广告。
  • 你能提供一些堆栈跟踪,最好是一个独立的例子吗?详情请参考 sscce.org。

标签: java c++ qt qtandroidextras qandroidjniobject


【解决方案1】:

您是否加载了正确的活动?您需要编辑清单以使其加载您的自定义活动。您还应该避免自己调用 QtActivity 类的构造函数 (advClass_("adv/appBucksAdv")),因为它会尝试再次准备应用程序。您可能想要的是 Activity 的句柄,因为您已经在扩展 QtActivity 类,只需添加一个返回句柄的静态函数。

例如:

Java:

public class appBucksAdv extends QtActivity
{
 ...
 static appBucksAdv getActivity() { return thisActivity; }
 ...
}

C++

QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("adv/appBucksAdv",
                                                                       "getActivity",
                                                                       "()Ladv/appBucksAdv;");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2012-02-25
    • 2017-09-14
    • 2021-10-01
    相关资源
    最近更新 更多