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. Native android code with QT
Forum Updated to NodeBB v4.3 + New Features

Native android code with QT

Scheduled Pinned Locked Moved Solved Mobile and Embedded
16 Posts 3 Posters 3.4k 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.
  • ashajgA Offline
    ashajgA Offline
    ashajg
    wrote on last edited by ashajg
    #6

    ok sir
    @sierdzio

    Now I have made following changes

    package com.amin.QtAndroidToastJava;
    
    import org.qtproject.qt5.android.bindings.QtApplication;
    import org.qtproject.qt5.android.bindings.QtActivity;
    import android.net.NetworkInfo.DetailedState;
    import android.net.wifi.WifiInfo;
    import android.net.wifi.WifiManager;
    import android.app.Activity;
    import android.content.Context;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    
    
    public class QtAndroidToastJava extends QtActivity
    {
    
    
    
    public static String getWifiName(Context context) {
        WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        if (manager.isWifiEnabled()) {
           WifiInfo wifiInfo = manager.getConnectionInfo();
           if (wifiInfo != null) {
              DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
              if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) {
                  return wifiInfo.getSSID();
              }
           }
        }
        return null;
    }
    

    /////////////////////////////////////

    #include "wificlass.h"
    #include <QtAndroid>
    #include <QDebug>
    WIFICLASS::WIFICLASS(QObject *parent) : QObject(parent)
    {
    
    }
    
    void WIFICLASS::updateAndroidNotification()
    {
    
    
    
       auto returnString = QAndroidJniObject::callStaticMethod <jstring>("com/amin/QtAndroidToastJava/QtAndroidToastJava",
                                                    "getWifiName","(V;)Ljava/lang/String");
    
       //QString user = juser.toString();
    
    
       qDebug()<<returnString;
    
    }
    

    After running I am getting this error

    ..\Wifipoc/wificlass.cpp:23: error: undefined reference to '_jstring QAndroidJniObject::callStaticMethod<_jstring>(char const*, char const*, char const*, ...)'
    collect2.exe: error: ld returned 1 exit status
    make: *** [libWifipoc.so] Error 1
    17:34:55: The process "C:\ASHISH\android-ndk-r15c\prebuilt\windows-x86_64\bin\make.exe" exited with code 2.
    Error while building/deploying project Wifipoc (kit: Android for armeabi-v7a (GCC 4.9, Qt 5.11.2 for Android ARMv7))
    When executing step "Make"
    17:34:55: Elapsed time: 00:06.**

    1 Reply Last reply
    0
    • sierdzioS Offline
      sierdzioS Offline
      sierdzio
      Moderators
      wrote on last edited by
      #7

      Hm, looks like the static method call needs a jclass instead of string. Weird.

      Try this:

      jclass myClass = "com/amin/QtAndroidToastJava/QtAndroidToastJava";
      auto returnString = QAndroidJniObject::callStaticMethod <jstring>(
          myClass, "getWifiName", "(V)Ljava/lang/String;");
      

      (Z(:^

      1 Reply Last reply
      0
      • ashajgA Offline
        ashajgA Offline
        ashajg
        wrote on last edited by
        #8

        Hi sir @sierdzio
        What I did is in my cpp file I added this line

        QAndroidJniObject returnString = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava","getWifiName","(Landroid/content/Context)",QtAndroid::androidContext().object());
        

        As I am using getWifiName(Context context) function it requires context from cpp.
        What I did is I added "(Landroid/content/Context)",QtAndroid::androidContext().object()); to check if it works but it is throwing these errors:

        W System.err: java.lang.NoSuchMethodError: no static method "Lorg/qtproject/example/QtAndroidToastJava;.getWifiName(Landroid/content/Context)"
        W System.err: at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
        W System.err: at org.qtproject.qt5.android.QtNative$6.run(QtNative.java:359)
        W System.err: at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61
        )

        I think I am making some mistake in this line "(Landroid/content/Context)",QtAndroid::androidContext().object());"

        how can I figure out what I should pass or where its getting wrong?

        sierdzioS 1 Reply Last reply
        0
        • ashajgA ashajg

          Hi sir @sierdzio
          What I did is in my cpp file I added this line

          QAndroidJniObject returnString = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava","getWifiName","(Landroid/content/Context)",QtAndroid::androidContext().object());
          

          As I am using getWifiName(Context context) function it requires context from cpp.
          What I did is I added "(Landroid/content/Context)",QtAndroid::androidContext().object()); to check if it works but it is throwing these errors:

          W System.err: java.lang.NoSuchMethodError: no static method "Lorg/qtproject/example/QtAndroidToastJava;.getWifiName(Landroid/content/Context)"
          W System.err: at org.qtproject.qt5.android.QtNative.startQtApplication(Native Method)
          W System.err: at org.qtproject.qt5.android.QtNative$6.run(QtNative.java:359)
          W System.err: at org.qtproject.qt5.android.QtThread$1.run(QtThread.java:61
          )

          I think I am making some mistake in this line "(Landroid/content/Context)",QtAndroid::androidContext().object());"

          how can I figure out what I should pass or where its getting wrong?

          sierdzioS Offline
          sierdzioS Offline
          sierdzio
          Moderators
          wrote on last edited by
          #9

          @ashajg said in Native android code with QT:

          how can I figure out what I should pass or where its getting wrong?

          Only by guessing, unfortunately. JNI is not clever enough to point our errors exactly.

          "(Landroid/content/Context)" - no return type (your method returns a string).

          I did tell you to drop the context arg, by the way. But if you want to keep it - so be it.

          (Z(:^

          ashajgA 1 Reply Last reply
          0
          • ashajgA Offline
            ashajgA Offline
            ashajg
            wrote on last edited by ashajg
            #10

            ok Sir
            I ll also try this

            jclass myClass = "com/amin/QtAndroidToastJava/QtAndroidToastJava";
            auto returnString = QAndroidJniObject::callStaticMethod <jstring>(
            myClass, "getWifiName", "(V)Ljava/lang/String;");

            it is saying cannot initialize a variable with jclass..

            1 Reply Last reply
            0
            • sierdzioS sierdzio

              @ashajg said in Native android code with QT:

              how can I figure out what I should pass or where its getting wrong?

              Only by guessing, unfortunately. JNI is not clever enough to point our errors exactly.

              "(Landroid/content/Context)" - no return type (your method returns a string).

              I did tell you to drop the context arg, by the way. But if you want to keep it - so be it.

              ashajgA Offline
              ashajgA Offline
              ashajg
              wrote on last edited by ashajg
              #11

              @sierdzio

              you asked to drop context so should I just write the code like this

              public class QtAndroidToastJava extends QtActivity
              {
              public String getWifiName(){
                  WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                  if (manager.isWifiEnabled()) {
                     WifiInfo wifiInfo = manager.getConnectionInfo();
                     if (wifiInfo != null) {
                        DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
                        if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) {
                            return wifiInfo.getSSID();
                        }
                     }
                  }
              

              its throwing error

              symbol: variable context
              location: class QtAndroidToastJava
              Note: Some input files use or override a deprecated API.
              if I remove context

              1 Reply Last reply
              0
              • ashajgA Offline
                ashajgA Offline
                ashajg
                wrote on last edited by
                #12

                Hi sir @sierdzio

                I got the solution :) by using this (Landroid/content/Context;)Ljava/lang/String; I got wifi name.

                1 Reply Last reply
                1
                • JoeCFDJ Offline
                  JoeCFDJ Offline
                  JoeCFD
                  wrote on last edited by JoeCFD
                  #13

                  I am trying to do the same thing. But
                  auto returnString = QAndroidJniObject::callStaticMethod <jstring>(
                  myClass, "getWifiName", "(V)Ljava/lang/String;");
                  causes compiling error.
                  undefined reference to `_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...)
                  QAndroidJniObject::callStaticMethod <jstring> is dropped? I tried int and func call works.

                  I checked the doc of Qt5
                  https://doc.qt.io/qt-5/qandroidjniobject.html
                  // C++ code
                  QAndroidJniObject stringNumber = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                  "fromNumber"
                  "(I)Ljava/lang/String;",
                  10);
                  should be work. But the call in my app returns empty object.
                  My Qt version: 5.15.2 and OS: Ubuntu 18.04

                  JoeCFDJ 1 Reply Last reply
                  0
                  • JoeCFDJ JoeCFD

                    I am trying to do the same thing. But
                    auto returnString = QAndroidJniObject::callStaticMethod <jstring>(
                    myClass, "getWifiName", "(V)Ljava/lang/String;");
                    causes compiling error.
                    undefined reference to `_jstring* QAndroidJniObject::callStaticMethod<_jstring*>(char const*, char const*, char const*, ...)
                    QAndroidJniObject::callStaticMethod <jstring> is dropped? I tried int and func call works.

                    I checked the doc of Qt5
                    https://doc.qt.io/qt-5/qandroidjniobject.html
                    // C++ code
                    QAndroidJniObject stringNumber = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/TestClass",
                    "fromNumber"
                    "(I)Ljava/lang/String;",
                    10);
                    should be work. But the call in my app returns empty object.
                    My Qt version: 5.15.2 and OS: Ubuntu 18.04

                    JoeCFDJ Offline
                    JoeCFDJ Offline
                    JoeCFD
                    wrote on last edited by
                    #14

                    @JoeCFD It works now. In my Java code, String has to be created with new.

                    1 Reply Last reply
                    0
                    • JoeCFDJ Offline
                      JoeCFDJ Offline
                      JoeCFD
                      wrote on last edited by
                      #15

                      wifiInfo.getSSID() returns unknown SSID.

                      JoeCFDJ 1 Reply Last reply
                      0
                      • JoeCFDJ JoeCFD

                        wifiInfo.getSSID() returns unknown SSID.

                        JoeCFDJ Offline
                        JoeCFDJ Offline
                        JoeCFD
                        wrote on last edited by
                        #16

                        @JoeCFD set permissions for location and wifi state change in manifestfile. And change location permission to my app in the tablet settings. The problem is solved.

                        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