最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Qt for Android(一) —— QT 中如何调用android方法|8月更文挑战

    正文概述 掘金(_q2nAmor)   2021-08-01   1146

    背景:

    最近项目迁到 Android 平台下运行,因此涉及了不少 Qt for Android 的开发,遂记录下来并分享出来给大家。

    QT 想要调用 android 的方法少不了 QAndroidJniObject 这个类,QT 官方文档对它有充分的解释说明:

    doc.qt.io/qt-5/qandro…

    本篇文章是专栏系列的基础,只要学会 QAndroidJniObject 的使用,Qt for Android 就掌握大半了。QAndroidJniObject 属于 androidextras 模块,要使用它,需要在 pro 文件中加入下面的代码:

    QT += androidextras
    

    如果是 CMake 项目,则需要加入下面的依赖:

    AndroidExtras
    

    androidextras 是从 Qt 5.2 引入的。这个模块内还包括了 QAndroidJniEnvironment 类,QAndroidJniEnvironment 代表 JNI 环境,也就是通常我们使用 JNI 编程时的 JNIEnv 。我们使用 Qt 进行 JNI 编程时,构造一个 QAndroidJniEnvironment 对象,即可获得 JNIEnv 指针,可以进一步使用 JNIEnv 的方法来实现特定功能,比如检查 JNI 调用过程中是否发生了异常、清理异常等等。

    实例

    调用无参无返回值的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
    
        public  void exitApp()
        {
            Log.i(CLASS_NAME, "exitApp");
            System.exit(0);
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    obj.callMethod<void>("exitApp");
    

    Java 的全路径类名,是带了包名的。 Java 中的包,可以类比于 C++ 里的 namespace ,一个包里可以包含了多个类,一方面方便将关联的类组织到一起,另一方面也可以避免名字冲突。当我们在 C++ 用以字符串方式描述一个 Java 类时,需要把 “.” 替换为 “/” ,如上的 org/qtproject/testDemo/SystemInfo,代表了 java 中的 SystemInfo 类。

    调用参数为基础类型的无返回值的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
    
        public  void testInt(int i)
        {
            Log.i(CLASS_NAME, "testInt:" + i);
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    int parm = 0;
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    obj.callMethod<void>("testInt", "(I)V", parm);
    
    调用参数为对象的无返回值的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
    
        public  void testString(String str)
        {
            Log.i(CLASS_NAME, "testString:" + str);
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    QString parm = "this is QString";
    QAndroidJniObject strObj = QAndroidJniObject::fromString(parm);
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    obj.callMethod<void>("testString","(Ljava/lang/String;)V", strObj.object<jstring>());
    
    调用返回值为基础类型的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
    
        public int testInt_I()
        {
            Log.i(CLASS_NAME, "testInt_I:void");
             return 3;
        }
         public int testInt_I(int i)
        {
            Log.i(CLASS_NAME, "testInt_I:" + i);
            return i;
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    ///无参数
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    const int value = obj.callMethod<jint>("testInt_I", "()I");
    
    
    //参数为int
    int parm = 0;
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    const int value = obj.callMethod<jint>("testInt_I", "(I)I", parm);
    
    调用返回值为对象类型的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
        String result="SystemInfo";
        
        public String testString()
        {
            Log.i(CLASS_NAME, "testString");
             return result;
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    ///无参数
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    QAndroidJniObject Result = obj.callObjectMethod("testString","()Ljava/lang/String;");
    qDebug() << "testString:" << Result.toString();
    
    调用返回值为对象类型参数为基础类型的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
        String result="SystemInfo";
        
        public String testString_I(int i)
        {
            Log.i(CLASS_NAME, "testString" + i);
            return result;
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    int pram = 3;
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    QAndroidJniObject Result = obj.callObjectMethod("testString","(I)Ljava/lang/String;",pram);
    qDebug() << "testString:" << Result.toString();
    
    调用返回值为对象类型参数为对象类型的成员函数

    java 函数原型

    package org.qtproject.testDemo;
    import android.util.Log;
    
    public class SystemInfo  {
        public static String CLASS_NAME = "SystemInfo";
        String result="SystemInfo";
        
        public String testString(String str)
        {
            Log.i(CLASS_NAME, "testString" + str);
            return str;
        }
    }
    

    QT 调用方式

    #include"QtAndroid"
    
    QAndroidJniObject obj("org/qtproject/testDemo/SystemInfo");
    QString param = "this is android";
    QAndroidJniObject paramobj = QAndroidJniObject::fromString(param);
    QAndroidJniObject Result = obj.callObjectMethod("testString","(Ljava/lang/String;)Ljava/lang/String;",paramobj.object<jstring>();
    qDebug() << "testString:" << Result.toString();
    

    起源地下载网 » Qt for Android(一) —— QT 中如何调用android方法|8月更文挑战

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元