我正在尝试在 Android 上将 parse.com 推送服务与 Qt5.5 一起使用。尝试调用 ParseInstallation.getCurrentInstallation() 时出现以下错误:
W/System.err( 9094): java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File com.parse.ParsePlugins.getParseDir()' on a null object reference
W/System.err( 9094): at com.parse.ParseCorePlugins.getCurrentInstallationController(ParseCorePlugins.java:272)
W/System.err( 9094): at com.parse.ParseInstallation.getCurrentInstallationController(ParseInstallation.java:52)
W/System.err( 9094): at com.parse.ParseInstallation.getCurrentInstallation(ParseInstallation.java:57)
这是我的代码:
QAndroidJniEnvironment env;
if (!QAndroidJniObject::isClassAvailable("com/parse/Parse")) {
qDebug() << "com/parse/Parse not available";
return;
}
if (!QAndroidJniObject::isClassAvailable("com/parse/ParseInstallation")) {
qDebug() << "com/parse/ParseInstallation not available";
return;
}
QAndroidJniObject applicationId = QAndroidJniObject::fromString("MY_PARSE_APPLICATION_ID");
QAndroidJniObject clientKey = QAndroidJniObject::fromString("MY_PARSE_CLIENT_ID");
QAndroidJniObject activity = QtAndroid::androidActivity();
if (!activity.isValid()) {
qDebug() << "invalid activity";
}
QAndroidJniObject application = activity.callObjectMethod("getApplication", "()Landroid/app/Application;");
if (!application.isValid()) {
qDebug() << "invalid application";
}
qDebug() << env->ExceptionCheck();
QAndroidJniObject::callStaticMethod<void>("com/parse/Parse",
"enableLocalDatastore",
"(Ljava/lang/object;)V",
application.object<jobject>()
);
qDebug() << env->ExceptionCheck();
QAndroidJniObject::callStaticMethod<void>("com/parse/Parse",
"initialize",
"(Ljava/lang/object;Ljava/lang/String;Ljava/lang/String;)V",
application.object<jobject>(),
applicationId.object<jstring>(),
clientKey.object<jstring>()
);
qDebug() << env->ExceptionCheck();
// this is where it fails, until here all exception checks show no error:
QAndroidJniObject parseInstallation = QAndroidJniObject::callStaticObjectMethod("com/parse/ParseInstallation",
"getCurrentInstallation",
"()Lcom/parse/ParseInstallation;");
// here ExceptionCheck reports an error for the first time
qDebug() << env->ExceptionCheck();
// this gives the above error message
env->ExceptionDescribe();
if (!parseInstallation.isValid()) {
qDebug() << "invalid parseInstallation";
return;
}
我的 AndroidManifest.xml 在打开应用程序标记之前有以下内容(myapp 是一个占位符,真实的应用程序 ID 设置正确):
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<!--
IMPORTANT: Change "com.parse.starter.permission.C2D_MESSAGE" in the lines below
to match your app's package name + ".permission.C2D_MESSAGE".
-->
<permission android:protectionLevel="signature" android:name="myapp.permission.C2D_MESSAGE"/>
<uses-permission android:name="myapp.permission.C2D_MESSAGE"/>
...以及关闭应用程序标记之前的以下内容:
<service android:name="com.parse.PushService"/>
<receiver android:name="com.parse.ParsePushBroadcastReceiver" android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE"/>
<action android:name="com.parse.push.intent.DELETE"/>
<action android:name="com.parse.push.intent.OPEN"/>
</intent-filter>
</receiver>
<receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<!--
IMPORTANT: Change "com.parse.starter" to match your app's package name.
-->
<category android:name="myapp"/>
</intent-filter>
</receiver>
到目前为止,我实际上一直在使用 v-play 插件,但它停止了工作,所以我尝试自己实现它,这意味着解析端配置正确,因为它曾经与 v-play 插件一起工作(直到它停止工作; ) - 但这是 v-play 方面的错误)
我究竟做错了什么?