Qt for Android(二) —— QT 中调用自定义Android方法详细教程|8月更文挑战

1,471 阅读2分钟

背景:

有时候我们使用 QT 的方法无法满足我们的需求,比如获取设备的 sn 号,使用 QT 方法是无法完成这个功能的,因此我们必须得借助 Android原生的函数完成这个功能。本文只是以“(获取Android设备的SN号)”为例,其他的方法调用都类似,要学会触类旁通、举一反三。

有了第一篇文章的基础,接下来的工作就变得很简单了。

Qt for Android(一) —— QT 中如何调用android方法

第一步——android代码添加

在这里插入图片描述 基于 Qmake 项目,在构建中选择 Create Templates,此时会在你的 pro 同级目录创建出 android 文件夹,这是一个默认的qtcreator 为你创建的android项目的基础结构,像这样: 在这里插入图片描述 在这个目录中没有 src 文件夹,即 存放java代码的目录,也没有 libs 文件夹,即可能依赖的 jar 包存放的目录,因此,这两个目录需要我们手动创建出来。

因为本篇文章我们要使用java的原生函数,因此需要创建出 src 目录,和我们要使用的java类。像这样: 在这里插入图片描述 注意图中划红线的地方,这是我们java代码的包名,需要自己创建,然后在最底层的 test 文件夹中创建我们要使用的java类。如下:

package com.qht.test;

import android.util.Log;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class Test  {
  
    public String getSN() {
        return execCmd("getprop ro.boot.serialno");
    }

    private String execCmd(String cmd){
        String result="";
        Process process = null;
        DataOutputStream dos = null;
        DataInputStream dis = null;
        try {
            process = Runtime.getRuntime().exec(cmd);
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream()));
            int read;
            char[] buffer = new char[4096];
            StringBuffer output = new StringBuffer();
            while ((read = reader.read(buffer)) > 0) {
                output.append(buffer, 0, read);
            }
            reader.close();
            process.waitFor();

            result = output.toString();
            return result;
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

Java 代码写完后,打开 android 目录下的 AndroidManifest.xml文件,修改下包名为我们自定义的包名即:com.qht.test。至此我们的android 部分就完成了。 在这里插入图片描述

第二步——QT 代码添加

上面我们写好android部分的代码后,我们下来需要在 QT中调用我们写好的 getSN方法: 首先引入头文件:

#include <QtAndroid>
#include <QAndroidJniEnvironment>
#include <QAndroidJniObject>
using namespace  QtAndroid;

 QAndroidJniObject class("com/qht/test/Test");
    QAndroidJniObject obj = class.callObjectMethod("getSN","()Ljava/lang/String;");
    qDebug() << "HardWare::getSystemDiskSN:" << obj.toString().simplified();

因为我们的getSN函数是无参返回String对象,因此采用上面的调用方式,看了第一篇文章的,到这块应该是没啥问题的。