Android Services: I can start a service using the same .so but i can't use a separate .so for the service code
-
wrote on 30 May 2017, 12:22 last edited by Mena
Hi,
I want to create an android service with its code in a separate .so file.I used this reference to start an android service with its code inside the same .so. successfully!
https://github.com/bbernhard/qtandroidservices_exampleI followed this reference to make separate .so files but failed:
https://www.kdab.com/qt-android-create-android-service-using-qt/Here's my code:
Manifest: (only relevant lines)
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.example.MyCustomAppActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="qtandroidservices_example"/> </activity> <service android:process=":qt" android:enabled="true" android:name="org.qtproject.example.MyCustomAppService"> <meta-data android:name="android.app.lib_name" android:value="server"/> <!-- Background running --> <meta-data android:name="android.app.background_running" android:value="true"/> <!-- Background running --> </service> </application> </manifest>
=============================================================
qtandroidservices_example.pro:
TEMPLATE = app win32{ QT += qml quick webview multimedia } android{ QT += qml quick webview multimedia androidextras } CONFIG += c++11 SOURCES += \ source/cpp/main.cpp RESOURCES += qml.qrc # Default rules for deployment. include(deployment.pri) DISTFILES += \ android/AndroidManifest.xml \ android/gradle/wrapper/gradle-wrapper.jar \ android/gradlew \ android/res/values/libs.xml \ android/build.gradle \ android/gradle/wrapper/gradle-wrapper.properties \ android/gradlew.bat \ android/local.properties \ source/java/MyBroadcastReceiver.java android { ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android ANDROID_JAVA_SOURCES.path = /src/org/qtproject/example ANDROID_JAVA_SOURCES.files = $$files($$PWD/source/java/*.java) INSTALLS += ANDROID_JAVA_SOURCES }
MyCustomAppActivity.java:
package org.qtproject.example; import org.qtproject.example.R; import org.qtproject.qt5.android.bindings.QtActivity; import org.qtproject.qt5.android.bindings.QtService; import org.qtproject.example.MyCustomAppService; import android.content.Intent; import android.util.Log; import android.os.Bundle; public class MyCustomAppActivity extends QtActivity { @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); Log.i("Activity", "Starting service!"); Intent serviceIntent = new Intent(this, org.qtproject.example.MyCustomAppService.class); startService(serviceIntent); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } }
=======================================================
MyCustomService.java:package org.qtproject.example; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.os.Bundle; import org.qtproject.qt5.android.bindings.QtService; import android.util.Log; public class MyCustomAppService extends QtService { /** Called when the service is being created. */ @Override public void onCreate() { Log.i("Service", "Service created!"); super.onCreate(); } /** The service is starting, due to a call to startService() */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("Service", "Service created!"); int ret = super.onStartCommand(intent, flags, startId); return ret; //return mStartMode; } }
===================================================
server.pro:TEMPLATE = lib TARGET = server CONFIG += dll QT += core SOURCES += \ server.cpp
==================================================
server.cpp:#include <QDebug> #ifdef Q_OS_ANDROID #include <QAndroidJniObject> #include <QtAndroid> #endif int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qWarning("I am serving"); return app.exec(); }
-
Hi,
I want to create an android service with its code in a separate .so file.I used this reference to start an android service with its code inside the same .so. successfully!
https://github.com/bbernhard/qtandroidservices_exampleI followed this reference to make separate .so files but failed:
https://www.kdab.com/qt-android-create-android-service-using-qt/Here's my code:
Manifest: (only relevant lines)
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --"> <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.example.MyCustomAppActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="qtandroidservices_example"/> </activity> <service android:process=":qt" android:enabled="true" android:name="org.qtproject.example.MyCustomAppService"> <meta-data android:name="android.app.lib_name" android:value="server"/> <!-- Background running --> <meta-data android:name="android.app.background_running" android:value="true"/> <!-- Background running --> </service> </application> </manifest>
=============================================================
qtandroidservices_example.pro:
TEMPLATE = app win32{ QT += qml quick webview multimedia } android{ QT += qml quick webview multimedia androidextras } CONFIG += c++11 SOURCES += \ source/cpp/main.cpp RESOURCES += qml.qrc # Default rules for deployment. include(deployment.pri) DISTFILES += \ android/AndroidManifest.xml \ android/gradle/wrapper/gradle-wrapper.jar \ android/gradlew \ android/res/values/libs.xml \ android/build.gradle \ android/gradle/wrapper/gradle-wrapper.properties \ android/gradlew.bat \ android/local.properties \ source/java/MyBroadcastReceiver.java android { ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android ANDROID_JAVA_SOURCES.path = /src/org/qtproject/example ANDROID_JAVA_SOURCES.files = $$files($$PWD/source/java/*.java) INSTALLS += ANDROID_JAVA_SOURCES }
MyCustomAppActivity.java:
package org.qtproject.example; import org.qtproject.example.R; import org.qtproject.qt5.android.bindings.QtActivity; import org.qtproject.qt5.android.bindings.QtService; import org.qtproject.example.MyCustomAppService; import android.content.Intent; import android.util.Log; import android.os.Bundle; public class MyCustomAppActivity extends QtActivity { @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); Log.i("Activity", "Starting service!"); Intent serviceIntent = new Intent(this, org.qtproject.example.MyCustomAppService.class); startService(serviceIntent); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); } }
=======================================================
MyCustomService.java:package org.qtproject.example; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.os.Bundle; import org.qtproject.qt5.android.bindings.QtService; import android.util.Log; public class MyCustomAppService extends QtService { /** Called when the service is being created. */ @Override public void onCreate() { Log.i("Service", "Service created!"); super.onCreate(); } /** The service is starting, due to a call to startService() */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("Service", "Service created!"); int ret = super.onStartCommand(intent, flags, startId); return ret; //return mStartMode; } }
===================================================
server.pro:TEMPLATE = lib TARGET = server CONFIG += dll QT += core SOURCES += \ server.cpp
==================================================
server.cpp:#include <QDebug> #ifdef Q_OS_ANDROID #include <QAndroidJniObject> #include <QtAndroid> #endif int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qWarning("I am serving"); return app.exec(); }
wrote on 11 Nov 2017, 15:18 last edited by md2012 11 Nov 2017, 15:24@Mena
Hello sir
i am struggling with the same problem here too.
1_can i have you code with the same .so file?
2_any progress since last time you posted this?When i use this example for test i get the error :
"E Qt : Can't create main activity"
but the service starts successfully with no UI because of the error.
i also use Qt5.9.2 -
wrote on 21 Nov 2017, 13:30 last edited by
Did you succeed with the service? I also had a lot of problems with it but I finally managed to make a working service. There are still a lot of things I need to sort out:
- How to correctly shut down the service
- How to find out in the main app that the service stopped and vice-versa.
- How to reconnect to a running service when the main app is started.
But the basics do work. I started by modifying the samples you mentioned. Do they work for you? That is the starting point. After each change I always tried if it still works. I found it extremely difficult to debug because currently QtCreator doesn't print any debug messages from a service. I use adb logcat to read debug messages from my service.
You can find my code here. The version with service (0.6) is not ready yet and there is no release APK. There are still many bugs and problems I need to sort out (like those mentioned above).
Also I'm not a C++ or Java professional. This is my hobby and there might be many faults and incorrect constructions. But it seems to work somehow. :-)