【问题标题】:How to integrate android native code with Qt Quick project?如何将 android 原生代码与 Qt Quick 项目集成?
【发布时间】:2018-11-23 06:44:16
【问题描述】:

我正在尝试使用 QAndroidJniObject 将 wifi 名称连接到我的手机。

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*, ...)'

我该如何解决这个问题?

这样做的正确方法是什么?

【问题讨论】:

  • 您是否在 .pro 文件中添加了QT += androidextras
  • @FrankOsterfeld 我在我的 pro 文件中添加了 QT += androidextras ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
  • 通过添加这一行 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)。

标签: android qt wifi qtandroidextras qandroidjniobject


【解决方案1】:

这里有两个问题:

1.) 您在 C++ 中传递的消息签名是错误的。应该是:

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

请注意每个班级名称末尾的;!总是L&lt;classname&gt;;!此外,您必须始终完全匹配在 java.util 中声明的方法。多个参数不需要分开。如果你有例如方法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() 将结果转换为字符串。

【讨论】:

  • 在这种情况下,您应该接受/支持答案,以便其他人可以看到这解决了问题。