Как интегрировать нативный код Android в проект Qt Quick? - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь подключить имя 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 *,...) '

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

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

1 Ответ

0 голосов
/ 23 ноября 2018

Здесь есть две неправильные вещи:

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

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

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

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

* 1014.*

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

...