Как интегрировать собственный код Android с проектом Qt Quick?

Я пытаюсь подключить имя Wi-Fi к моему мобильному телефону, используя QAndroidJniObject.

Java-файл:

package org.qtproject.example;
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;
    }
}

Мой код cpp

void WIFICLASS::updateAndroidNotification()
{

qDebug()<<"******************************************8";

auto returnString = QAndroidJniObject::callStaticMethod <jstring>("org/qtproject/example/QtAndroidToastJava",
                                             "getWifiName","(V;)Ljava/lang/String");

// //  QString user = juser.toString();
//   qDebug()<<"ANSWER"<<user;

 qDebug()<<returnString;

}

После попытки построить это я получаю следующие ошибки: 23: ошибка: неопределенная ссылка на '_jstring* QAndroidJniObject::callStaticMethod‹_jstring*>(char const*, char const*, char const*, ...)< /сильный>'

Как я могу решить эту проблему?

Каков правильный способ сделать это?


person Ash    schedule 23.11.2018    source источник
comment
Вы добавили QT += androidextras в файл .pro?   -  person Frank Osterfeld    schedule 23.11.2018
comment
@FrankOsterfeld Я добавил QT += androidextras ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android в свой профессиональный файл   -  person Ash    schedule 23.11.2018
comment
Добавляя эту строку QAndroidJniObject returnString = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava","getWifiName","(Landroid/content/Context)",QtAndroid::androidContext().object());**, я получаю сообщение об ошибке: W System.err: java.lang.NoSuchMethodError: no static method Lorg/qtproject/example/QtAndroidToastJava;.getWifiName(Landroid/content/Context) я думаю Мне нужны правильные аргументы для контекста, поскольку я использую контекст getWifiName(Context context) в качестве параметра моей функции в java@FrankOsterfeld, что я должен добавить вместо (Landroid/content/Context).   -  person Ash    schedule 23.11.2018


Ответы (1)


Здесь две ошибки:

1.) Подпись сообщения, которую вы передаете на С++, неверна. Должен быть:

"(Landroid/content/Context;)Ljava/lang/String;"

Обратите внимание на ; в конце имени каждого класса! Всегда L<classname>;! Кроме того, вы всегда должны точно соответствовать методу, объявленному в java. Несколько параметров не нужно разделять. Если у вас есть, например. метод void test(int a, int b), подпись будет (II)V.

2.) Метод, который вы вызываете, является методом объекта, что означает, что вы должны использовать QAndroidJniObject::callStaticObjectMethod

auto res = QAndroidJniObject::callStaticObjectMethod("org/qtproject/example/QtAndroidToastJava",
                                                     "getWifiName",
                                                     "(Landroid/content/Context;)Ljava/lang/String;",
                                                     QtAndroid::androidContext().object());

Этот метод возвращает вам QAndroidJniObject, и вы можете вызвать QAndroidJniObject::toString(), чтобы преобразовать результат в строку.

person Felix    schedule 23.11.2018
comment
В этом случае вы должны принять/проголосовать за ответ, чтобы другие люди могли видеть, что это решило проблему. - person Felix; 23.11.2018