Qt5.15 在Android上调用java方法
使用Qt的QtAndroidExtras模块来实现对Java类的调用
Qt5提供了QtAndroidExtras模块来实现对Android的操作
调用静态方法
对于无需构建类实例 即可调用的静态方法,可以通过QAndroidJniObject类中:callStaticMethod 或者 callStaticObjectMethod方法直接调用;
对于返回类型为基础数据类型的,可以使用callMethod
对于返回类型为java类的,需要使用callObjectMethod
QAndroidJniObject::callStaticMethod(“类名”,"方法名","方法签名",各个参数...)
若方法不需要参数,则可以省略方法签名及参数:
QAndroidJniObject::callStaticMethod(“类名”,"方法名")
调用非静态方法
对于需要构建类实例才能调用的非静态方法,需要用 QAndroidJniObject 类构建一个java类的实例,再使用这个实例来调用类的方法;
构造java类实例:
类初始化方法无参数:
QAndroidJniObject object("类名")
类初始化方法有参数:
QAndroidJniObject object(
"类名"
,"初始化方法名"
,“初始化方法签名”
,对应签名的各个参数...
)
调用类方法
对于返回类型为基础数据类型的,可以使用callMethod
对于返回类型为java类的,需要使用callObjectMethod
object.callMethod<数据类型>(
"方法名",
"方法签名".
对应签名的各个参数...
)
object.callObjectMethod(
"方法名",
"方法签名".
对应签名的各个参数...
)
若方法不需要参数,则可以省略方法签名及参数
获取类中成员变量
当返回值为类时,若类中成员变量拥有get\set方法,可以调用get方法来获取;
若无get方法,可以使用getField 或 getObjectField 或 getStaticObjectField 方法来获取;
T getField(const char *fieldName) const
QAndroidJniObject getObjectField(const char *fieldName) const
QAndroidJniObject getObjectField(const char *fieldName, const char *signature) const
签名
###类名
类名格式为:完整包名/类名
其中包名中的 . 需要用 / 来代替
方法签名
方法签名格式为: (参数数据类型)返回值数据类型
如:
(I)V
------表示:输入参数为1个int,返回值为void
(Ljava/lang/Sring;)I
------表示:输入参数为1个String,返回值为int
(Ljava/lang/Sring;Ljava/lang/Sring;)Ljava/lang/Sring;
------表示:输入参数为2个String,返回值为String
签名中对类的表示为:L含包名的类名; 包名路径中的 . 用 / 代替
如:
类名:java.lang.String
签名:Ljava/lang/Sring;
数据类型签名
遵循JNI数据类型定义
JNI 数据类型
基础类型
Type | Signature |
---|---|
jboolean | Z |
jbyte | B |
jchar | C |
jshort | S |
jint | I |
jlong | J |
jfloat | F |
jdouble | D |
对象类型
数据类型 | 签名 |
---|---|
jobject | Ljava/lang/Object; |
jclass | Ljava/lang/Class; |
jstring | Ljava/lang/String; |
jthrowable | Ljava/lang/Throwable; |
jobject | Array[Ljava/lang/Object; |
jarray | [<type > |
jbooleanArray | [Z |
jbyteArray | [B |
jcharArray | [C |
jshortArray | [S |
jintArray | [I |
jlongArray | [J |
jfloatArray | [F |
jdoubleArray | [D |
其它类型
Type | Signature |
---|---|
void | V |
自定义类 | L<含包名的类名>; |
调用示例代码
java代码
packge com.demoPackage;
public class demoClass{
public static String staticMember="this is a staticMenber";
public String member = "this is a nonstatic menber";
public void voidReturnMethod(int a){
System.out.println("voidReturnFunc called");
}
public int intReturnMethod(){
return 1;
}
public String stringReturnMethod(String stringIn){
System.out.println("stringReturnFunc called , input : "+stringIn);
return stringIn+"_return";
}
public static String staticMethod(int a){
System.out.println("voidReturnFunc called");
return "return : "+a;
}
//形参中有类对象
public void parmWithClass(Class<?> cls){
System.out.println("parmWithClasscalled");
return ;
}
}
Qt调用代码
#include <QDebug> //只是为了在输出内容,与调用Android下Jar包无关
#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroid>
public class callAndroidJarDemo{
void CheckSDKExceptionOccured()
{
QAndroidJniEnvironment env;
if (env->ExceptionCheck()) {
// Handle exception here.
//在运行输出中打印异常信息
env->ExceptionDescribe();
//释放异常
env->ExceptionClear();
}
}
void callvoidReturnMethod()
{
QAndroidJniObject jniObject("com/demoPackage/demoClass");
CheckSDKExceptionOccured();
jniObject.callMethod<void>("voidReturnMethod");
CheckSDKExceptionOccured();
}
void callMethod()
{
QAndroidJniObject jniObject("com/demoPackage/demoClass");
CheckSDKExceptionOccured();
jint intReturnValue = jniObject.callMethod<int>("intReturnMethod");
CheckSDKExceptionOccured();
qDebug() << intReturnValue;
}
void callObjectMethod()
{
QAndroidJniObject jniObject("com/demoPackage/demoClass");
CheckSDKExceptionOccured();
QAndroidJniObject stringObjectIn = QAndroidJniObject::fromString("inputString");
QAndroidJniObject stringObjectReturn = jniObject.callObjectMethod("stringReturnMethod",
"(Ljava/lang/String;)Ljava/lang/String;",
stringObjectIn .object());
CheckSDKExceptionOccured();
qDebug()<<stringObjectReturn .toString();
}
void callStaticMethod()
{
QAndroidJniObject stringObjectReturn = QAndroidJniObject::callStaticObjectMethod("staticMethod",
"(I)Ljava/lang/String;",
123);
CheckSDKExceptionOccured();
qDebug()<<stringObjectReturn .toString();
}
void callMethodparmWithClass()
{
QAndroidJniEnvironment env;
//要保证类名是存在的,如果是第三方包里的类 需要把第三方jar包引入
jclass clazz = env.findClass("要传入的包名/类名");
QAndroidJniObject jniObject("com/demoPackage/demoClass");
CheckSDKExceptionOccured();
jniObject.callMethod<void>("parmWithClass","(L要传入的包名/类名;)V",clazz);
CheckSDKExceptionOccured();
}