如何将Android本机代码与Qt Quick项目集成在一起?

时间:2018-11-23 06:44:17

标签: android qt wifi qtandroidextras qandroidjniobject

我正在尝试使用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 *,...)的未定义引用'

如何解决此问题?

正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

这里有两件事是错误的:

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

"(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()将结果转换为字符串。