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 deployment with Ministro
Forum Updated to NodeBB v4.3 + New Features

Android deployment with Ministro

Scheduled Pinned Locked Moved Unsolved Mobile and Embedded
androidqt 5.7deployingministro
21 Posts 2 Posters 10.2k Views 2 Watching
  • 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.
  • KroMignonK KroMignon

    @raven-worx

    I use this to call C++ functions from Java, for example to be informed about Battery and WIFI level (which are got with an Android/Java BroadcastReceiver).

    I don't understand why this works when Qt libs in APK and don't work when using Ministro...

    raven-worxR Offline
    raven-worxR Offline
    raven-worx
    Moderators
    wrote on last edited by
    #12

    @KroMignon
    again: what is this library? Is this a simple default library linked to your application or is it a plugin?
    How did you (exactly) add this library to your APK?

    I guess at the time you are trying to call the native method the method isn't registered yet. And set a breakpoint in your JNI_OnLoad(), as i already suggested. If the crash occurs before the breakpoint is hit, then this is your problem.

    If thats the case you can try to create the Java notification callback once you are sure that the methods have been registered successfully. You could set a Java variable at the end of JNI_onLoad() for example.

    --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
    If you have a question please use the forum so others can benefit from the solution in the future

    KroMignonK 1 Reply Last reply
    0
    • raven-worxR raven-worx

      @KroMignon
      again: what is this library? Is this a simple default library linked to your application or is it a plugin?
      How did you (exactly) add this library to your APK?

      I guess at the time you are trying to call the native method the method isn't registered yet. And set a breakpoint in your JNI_OnLoad(), as i already suggested. If the crash occurs before the breakpoint is hit, then this is your problem.

      If thats the case you can try to create the Java notification callback once you are sure that the methods have been registered successfully. You could set a Java variable at the end of JNI_onLoad() for example.

      KroMignonK Offline
      KroMignonK Offline
      KroMignon
      wrote on last edited by
      #13

      @raven-worx

      This is in my application, there no external library, other than Qt.
      This JNI_OnLoad() function is in a C++ class in my App project. The file name is JniInterfaces.cpp.
      The function signature is:

      ...
      static void focusWindow(JNIEnv * /*env*/,
                              jobject /*obj*/)
      {
          if(HandheldInit::exists() && qGuiApp->focusWindow() != Q_NULLPTR)
          {
              QTimer::singleShot(0, qGuiApp->focusWindow(), SLOT(raise()));
          }
      }
      
      //create a vector with all our JNINativeMethod(s)
      static JNINativeMethod methods[] = {
          { "focusWindow", "()V", (void *)focusWindow },
      };
      // this method is called automatically by Java after the .so file is loaded
      JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
      { ... } // See BogDan Vatra presentation at Qt Con 2016
      ...
      

      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

      raven-worxR 1 Reply Last reply
      0
      • KroMignonK KroMignon

        @raven-worx

        This is in my application, there no external library, other than Qt.
        This JNI_OnLoad() function is in a C++ class in my App project. The file name is JniInterfaces.cpp.
        The function signature is:

        ...
        static void focusWindow(JNIEnv * /*env*/,
                                jobject /*obj*/)
        {
            if(HandheldInit::exists() && qGuiApp->focusWindow() != Q_NULLPTR)
            {
                QTimer::singleShot(0, qGuiApp->focusWindow(), SLOT(raise()));
            }
        }
        
        //create a vector with all our JNINativeMethod(s)
        static JNINativeMethod methods[] = {
            { "focusWindow", "()V", (void *)focusWindow },
        };
        // this method is called automatically by Java after the .so file is loaded
        JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
        { ... } // See BogDan Vatra presentation at Qt Con 2016
        ...
        
        raven-worxR Offline
        raven-worxR Offline
        raven-worx
        Moderators
        wrote on last edited by raven-worx
        #14

        @KroMignon
        ok i give up....
        I am on hold until you answer the questions i asked. I wont ask a third time....

        --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
        If you have a question please use the forum so others can benefit from the solution in the future

        KroMignonK 1 Reply Last reply
        0
        • raven-worxR raven-worx

          @KroMignon
          ok i give up....
          I am on hold until you answer the questions i asked. I wont ask a third time....

          KroMignonK Offline
          KroMignonK Offline
          KroMignon
          wrote on last edited by
          #15

          @raven-worx: sorry but there is no other library than Qt libraries...
          I don't understand your question!
          JNI_OnLoad() is in my application Project, focusWindow() also.
          The Java code also.
          There is no library!!!

          It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

          raven-worxR 1 Reply Last reply
          0
          • KroMignonK KroMignon

            @raven-worx: sorry but there is no other library than Qt libraries...
            I don't understand your question!
            JNI_OnLoad() is in my application Project, focusWindow() also.
            The Java code also.
            There is no library!!!

            raven-worxR Offline
            raven-worxR Offline
            raven-worx
            Moderators
            wrote on last edited by
            #16

            @KroMignon said in Android deployment with Ministro:

            There is no library!!!

            @KroMignon said in Android deployment with Ministro:

            // this method is called automatically by Java after the .so file is loaded
            JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /reserved/)
            { ... } // See BogDan Vatra presentation at Qt Con 2016

            You said it's working when you don't use Ministro but bundle the Qt libs with the APK.
            But even then the JNI_OnLoad() wouldn't be called, since you implemented JNI_OnLoad() not in a library.

            --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
            If you have a question please use the forum so others can benefit from the solution in the future

            KroMignonK 1 Reply Last reply
            0
            • raven-worxR raven-worx

              @KroMignon said in Android deployment with Ministro:

              There is no library!!!

              @KroMignon said in Android deployment with Ministro:

              // this method is called automatically by Java after the .so file is loaded
              JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /reserved/)
              { ... } // See BogDan Vatra presentation at Qt Con 2016

              You said it's working when you don't use Ministro but bundle the Qt libs with the APK.
              But even then the JNI_OnLoad() wouldn't be called, since you implemented JNI_OnLoad() not in a library.

              KroMignonK Offline
              KroMignonK Offline
              KroMignon
              wrote on last edited by
              #17

              @raven-worx: the Qt Project create a library, called libNavDispatchHandheld.so, this is in the APK in /lib/armeabi-v7a.
              Is this your are talking about?
              And in this lib, which contains my C++ classes, is the JNI_OnLoad() function.

              It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

              KroMignonK 1 Reply Last reply
              0
              • KroMignonK KroMignon

                @raven-worx: the Qt Project create a library, called libNavDispatchHandheld.so, this is in the APK in /lib/armeabi-v7a.
                Is this your are talking about?
                And in this lib, which contains my C++ classes, is the JNI_OnLoad() function.

                KroMignonK Offline
                KroMignonK Offline
                KroMignon
                wrote on last edited by
                #18

                @raven-worx: just to pass this annoying question about JNI. I have made a simple test, on which I removed all JNI functions (from Java => C++)
                This also didn't work.
                I've got an system error which indicates Ministro not available. But I have installed it (App-Info say it is v10.5).

                Is Qt5.7.1 not supported by Ministro?

                I there a way to generate APK with all needed Qt stuff and then just do "upgrades" with my libs/qml/whatever ?

                I'm a big Qt enthusiast, but it is very discouraging and sad to have the feeling to have to battle agains the System and not to work with it :(

                It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                raven-worxR 1 Reply Last reply
                0
                • KroMignonK KroMignon

                  @raven-worx: just to pass this annoying question about JNI. I have made a simple test, on which I removed all JNI functions (from Java => C++)
                  This also didn't work.
                  I've got an system error which indicates Ministro not available. But I have installed it (App-Info say it is v10.5).

                  Is Qt5.7.1 not supported by Ministro?

                  I there a way to generate APK with all needed Qt stuff and then just do "upgrades" with my libs/qml/whatever ?

                  I'm a big Qt enthusiast, but it is very discouraging and sad to have the feeling to have to battle agains the System and not to work with it :(

                  raven-worxR Offline
                  raven-worxR Offline
                  raven-worx
                  Moderators
                  wrote on last edited by
                  #19

                  @KroMignon said in Android deployment with Ministro:

                  just to pass this annoying question about JNI. I have made a simple test, on which I removed all JNI functions (from Java => C++)
                  This also didn't work.

                  same error/exception?!?!

                  --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                  If you have a question please use the forum so others can benefit from the solution in the future

                  KroMignonK 2 Replies Last reply
                  0
                  • raven-worxR raven-worx

                    @KroMignon said in Android deployment with Ministro:

                    just to pass this annoying question about JNI. I have made a simple test, on which I removed all JNI functions (from Java => C++)
                    This also didn't work.

                    same error/exception?!?!

                    KroMignonK Offline
                    KroMignonK Offline
                    KroMignon
                    wrote on last edited by
                    #20

                    @raven-worx : no, there is an Android Popup which says I have to install Ministro... Which is already installed! ==> v10.5

                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                    1 Reply Last reply
                    0
                    • raven-worxR raven-worx

                      @KroMignon said in Android deployment with Ministro:

                      just to pass this annoying question about JNI. I have made a simple test, on which I removed all JNI functions (from Java => C++)
                      This also didn't work.

                      same error/exception?!?!

                      KroMignonK Offline
                      KroMignonK Offline
                      KroMignon
                      wrote on last edited by
                      #21

                      @raven-worx : I've got an answer from BogDan Vatra, in fact Ministro does not support Qt 5.7.x
                      This is why nothing works when generating APK with Ministro.

                      Qt5.7.x support will be added some time later. This is a bad news for me... I can't wait for a Ministro update.

                      So I found a workaround, I give it here, perhaps this could help someone else.

                      I have create a APK with Qt lib included, in release mode but not signed.
                      From this APK, which is in fact a ZIP archive, I've extract all Qt specific stuff:

                      • assets/--Added-by-androiddeployqt--/*
                      • lib/armeabi-v7a/libplugins_*
                      • lib/armeabi-v7a/libqml_*
                      • lib/armeabi-v7a/libQt5*
                      • lib/armeabi-v7a/libgnustl_shared

                      I copy those files on device, into internal storage.
                      Then, I generate new APK (same configuration: release, with Qt libs and not signed).
                      To generate the update APK, I remove from this the Qt specific stuff (so APK size is now less than 2MB).
                      I transfer this APK on device, on device side I insert missed Qt libs into.
                      Then I start APK installation on device.

                      This a very dirty way to do it, but it WorksForMe(TM)

                      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                      1 Reply Last reply
                      1

                      • Login

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