Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Android Services: I can start a service using the same .so but i can't use a separate .so for the service code

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

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
3 Posts 3 Posters 2.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Mena
    wrote on 30 May 2017, 12:22 last edited by Mena
    #1

    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();
    }
    
    M 1 Reply Last reply 11 Nov 2017, 15:18
    0
    • M Mena
      30 May 2017, 12:22

      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();
      }
      
      M Offline
      M Offline
      md2012
      wrote on 11 Nov 2017, 15:18 last edited by md2012 11 Nov 2017, 15:24
      #2

      @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

      1 Reply Last reply
      0
      • V Offline
        V Offline
        vlada
        wrote on 21 Nov 2017, 13:30 last edited by
        #3

        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. :-)

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved