tips: Qt5 call android static function

本文介绍如何在Qt中集成Android特定功能,包括配置Qt项目文件以包含Android组件、手动编辑AndroidManifest.xml文件来添加权限及指定活动名称,并提供通过Java代码实现获取WiFi列表的具体示例。


 1.      ?.pro file add:

QT += qml quick androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources

OTHER_FILES += \
    android-sources/AndroidManifest.xml \
    android-sources/src/org/qtproject/qmhp/AndroidCodeMhp.java



2.      gen AndroidManifest.xml file; add premission 

AndroidManifest.xml file in "Xml Source" window , make  a change by hand.

 default activity name is "qt.project.qt5.example.bindings.qtActivity" cause qt don't know your java class name, should be change by hand. 

following is a example:


AndroidManifest.xml:

<?xml version="1.0"?>

<manifest package="org.qtproject.qmhp" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Qmhp" android:icon="@drawable/icon">
        <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qmhp.AndroidCodeMhp" android:label="@string/app_name" android:screenOrientation="unspecified" android:launchMode="singleTop">


package:  org.qtproject.qmhp

java File nameAndroidCodeMhp.java

java Class : AndroidCodeMhp


3.      qt5 can only call static java function for now.


example java code(get wifi list):

package org.qtproject.qmhp;


import org.qtproject.qt5.android.bindings.QtActivity;
import org.qtproject.qt5.android.bindings.QtApplication;

import java.lang.String;
import java.util.List;
import android.util.Log;

import android.content.Context;


import android.net.wifi.WifiManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.ScanResult;





public class AndroidCodeMhp extends QtActivity
{
    private static AndroidCodeMhp m_instance;

    private static WifiManager m_wifiManager = null;
    private static WifiInfo m_wifiInfo = null;
    private static List<ScanResult>  m_wifiList;


    	public AndroidCodeMhp()
    {
        m_instance = this;
    }


// WIFI
    public static String getWifi(int nu) {
        if (m_wifiManager == null) {
            m_wifiManager = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE);
        }
        m_wifiManager.setWifiEnabled(true);
        m_wifiInfo = m_wifiManager.getConnectionInfo();
        return getWifiInfo();
    }

    public static String getWifiList(int nu){

        if (m_wifiManager == null) {
            m_wifiManager = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE);
        }
        m_wifiManager.setWifiEnabled(true);

        m_wifiManager.startScan();
         m_wifiList= m_wifiManager.getScanResults();
        if ( m_wifiList.size() == 0){
                    return "n/a";
        }
        String string = new String();
        for (int i = 0; i <  m_wifiList.size(); i++) {
            string += (( m_wifiList.get(i)).toString());
            string += ";";
        }
        return string;
    }


    public static String getWifiInfo() {
        return (m_wifiInfo == null) ? "NULL" : m_wifiInfo.toString();
    }
    ...



}



4. call from qt like following: 

there is a bug, the function must have parameter, other else noting will return. 

the following parameter "22" is not used, but when I use "(V)Ljava/lang/String;" got nothing;

#include <QtAndroidExtras/QAndroidJniObject>

...

    QAndroidJniObject androidString=
    QAndroidJniObject::callStaticObjectMethod(
                "org/qtproject/qmhp/AndroidCodeMhp",
                                              "getWifiList",
                                              "(I)Ljava/lang/String;",
                                              22);
    m_androidWifiData = androidString.toString();
...


qt call android did work,  but must be careful.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值