背景:
有时候我们使用 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对象,因此采用上面的调用方式,看了第一篇文章的,到这块应该是没啥问题的。