Java 未调用静态对象的Android ctor
编写一个主要使用Qt和QML的android应用程序,我试图遵循以下原则。当我运行这个示例时,事情按预期工作,但当我将几乎相同的代码放入我的应用程序时,它不会调用其中一个静态对象的ctor,因此事情会失败。以下是我的Java代码: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
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对象的任何显式初始化。根据你的描述,这个例子写得不正确,这只是一个意外,它的工作?