Java 未调用静态对象的Android ctor

Java 未调用静态对象的Android ctor,java,android,qt,qml,qtquick2,Java,Android,Qt,Qml,Qtquick2,编写一个主要使用Qt和QML的android应用程序,我试图遵循以下原则。当我运行这个示例时,事情按预期工作,但当我将几乎相同的代码放入我的应用程序时,它不会调用其中一个静态对象的ctor,因此事情会失败。以下是我的Java代码: package com.me.myApp; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import

编写一个主要使用Qt和QML的android应用程序,我试图遵循以下原则。当我运行这个示例时,事情按预期工作,但当我将几乎相同的代码放入我的应用程序时,它不会调用其中一个静态对象的ctor,因此事情会失败。以下是我的Java代码:

package com.me.myApp;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.util.Log;

public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity {
    private static final String TAG = "myApp::NotificationClient";
    private static NotificationManager m_notificationManager;
    private static Notification.Builder m_builder;
    private static NotificationClient m_instance;

    public NotificationClient() {
        Log.d(TAG, "Doing ctor");
        m_instance = this;
    }

    public static void notify(String s) {
        Log.d(TAG, "Doing the update thing");
        if(m_instance == null) {
            Log.d(TAG, "I have a null instance");
        }
        try {
            if (m_notificationManager == null) {
                m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
                m_builder = new Notification.Builder(m_instance);
//              m_builder.setSmallIcon(R.drawable.icon);
                m_builder.setContentTitle("A message from Qt!");
            }

            m_builder.setContentText(s);
            m_notificationManager.notify(1, m_builder.build());
        }
        catch (Exception ex) {
            Log.d(TAG, "Notify error: " + ex.toString());
        }
    }
}
查看日志文件,它进入了
notify()
函数,但
m_实例
null
,因为从未调用
NotificationClient
ctor

发生这种情况的原因是什么?

m_实例(不遵循Java命名约定)仅在
NotificationClient
构造函数中初始化,但它是
静态成员。除此之外,这意味着每个实例初始化都会不可预测地改变该值,在您的代码中从未实际调用构造函数。类型的静态成员不会神奇地调用其构造函数;它只有在代码调用它时才被构造

你永远不应该假设某件事是以某种方式发生的,你应该通过研究文档来知道发生了什么。

如果没有显式初始化,成员值将保留其默认值;对于
NotificationClient
成员,该值为
null
m_实例
(不遵循Java命名约定)仅在
NotificationClient
构造函数中初始化,但它是
静态
成员。除此之外,这意味着每个实例初始化都会不可预测地改变该值,在您的代码中从未实际调用构造函数。类型的静态成员不会神奇地调用其构造函数;它只有在代码调用它时才被构造

你永远不应该假设某件事是以某种方式发生的,你应该通过研究文档来知道发生了什么。


如果没有显式初始化,成员值将保留其默认值;对于您的
NotificationClient
成员,该值为
null

安卓Qt应用程序是一个精简Java层的组合,该层在启动时调用打包为动态
so
库的Qt应用程序。更多细节可以在Vatra@KDAB先生主持的一个nice系列的博文中找到

Java层正好是主活动加上一些实用程序类,在中可用

创建新的Android项目时,Qt Creator会自动生成一个
清单
文件,该文件使用Qt中可用的默认类。只要使用默认设置,一切正常

在您的情况下,您必须扩展默认的主活动以添加自定义活动 Java代码,为主活动生成一个新名称(
NotificationClient
)。但是,清单指向(仍然)可用的基类,即清单中的:

android:name="org.qtproject.qt5.android.bindings.QtActivity"
在这种情况下,调用超类ctor,因此未为
静态
变量分配有效值,从而导致
nullPointerException
问题。在清单中设置正确的新主活动可以解决此问题:

android:name="com.me.myApp.NotificationClient"

我建议你仔细阅读上面链接的博客文章系列,因为它们很容易理解Android QT项目中的java C++交互。p> 安卓Qt应用程序是一个薄Java层的复合物,在启动时,该层调用打包为动态
so
库的Qt应用程序。更多细节可以在Vatra@KDAB先生主持的一个nice系列的博文中找到

Java层正好是主活动加上一些实用程序类,在中可用

创建新的Android项目时,Qt Creator会自动生成一个
清单
文件,该文件使用Qt中可用的默认类。只要使用默认设置,一切正常

在您的情况下,您必须扩展默认的主活动以添加自定义活动 Java代码,为主活动生成一个新名称(
NotificationClient
)。但是,清单指向(仍然)可用的基类,即清单中的:

android:name="org.qtproject.qt5.android.bindings.QtActivity"
在这种情况下,调用超类ctor,因此未为
静态
变量分配有效值,从而导致
nullPointerException
问题。在清单中设置正确的新主活动可以解决此问题:

android:name="com.me.myApp.NotificationClient"

我建议你仔细阅读上面链接的博客文章系列,因为它们很容易理解Android QT项目中的java C++交互。p> 我的代码几乎一字不差地取自qt示例。再次查看他们的示例,我没有看到java NotificationClient对象的任何显式初始化。根据您的描述,这个示例编写得不正确,它的工作只是一个意外?我的代码几乎是从qt示例中一字不差地提取出来的。再次查看他们的示例,我没有看到java NotificationClient对象的任何显式初始化。根据你的描述,这个例子写得不正确,这只是一个意外,它的工作?