Android Services: I can start a service using the same .so but i can't use a separate .so for the service code



  • 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_example

    I 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();
    }
    


  • @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



  • 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:

    1. How to correctly shut down the service
    2. How to find out in the main app that the service stopped and vice-versa.
    3. 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. :-)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.