看看男人日女人,亚洲欧美日韩日本国产三,国产精品欧美日韩区二区,妓女影库妓女网在线视频

Qt安卓開發(fā)經(jīng)驗(yàn)001-010(qt 安卓開發(fā))

  1. pro中引入安卓拓展模塊 Qt = androidextras 。
  2. pro中指定安卓打包目錄 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android 指定引入安卓特定目錄比如程序圖標(biāo)、變量、顏色、java代碼文件、jar庫(kù)文件等。
  • AndroidManifest.xml 每個(gè)程序唯一的一個(gè)全局配置文件,里面xml格式的數(shù)據(jù),標(biāo)明支持的安卓版本、圖標(biāo)位置、橫屏豎屏、權(quán)限等。這個(gè)文件是最關(guān)鍵的,如果沒有這個(gè)文件則Qt會(huì)默認(rèn)生成一個(gè)。
  • android/res/drawable-hdpi drawable-xxxhdpi 等目錄下存放的是應(yīng)用程序圖標(biāo)。
  • android/res/layout 目錄下存放的布局文件。
  • android/res/values/libs.xml 存儲(chǔ)的一些變量值。
  • android/libs 目錄下存放的jar庫(kù)文件。
  • android/src 目錄下存放的java代碼文件,可以是根據(jù)包名建立的一層層子目錄,也可以直接在src目錄下。
  • 其他目錄自行搜索安卓目錄規(guī)范。
  • 后面的說明統(tǒng)一用的android目錄舉例,其實(shí)你可以改成任意目錄,比如你的代碼目錄下是xxoo存放的安卓相關(guān)的打包文件,你就寫成 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/xxoo 。
  1. java類名必須和文件名完全一致,區(qū)分大小寫。
  2. java類必須在android/src目錄下不然不會(huì)打包到apk文件,可以是子目錄比如 android/src/com/qt 。
  3. Qt代碼中的QAndroidJniObject指定傳入的java包名,必須嚴(yán)格和java文件package完全一致,不然程序執(zhí)行到此處會(huì)因?yàn)檎也坏蕉罎ⅰ?/li>
  • android/scr/MainActivity.java 頂部 沒有 package 則代碼中必須是 QAndroidJniObject javaClass("MainActivity");
  • android/scr/MainActivity.java 頂部 package com.qandroid; 則代碼中必須是 QAndroidJniObject javaClass("com/qandroid/MainActivity");
  • android/scr/com/example/MainActivity.java 頂部 package com.qandroid; 則代碼中必須是 QAndroidJniObject javaClass("com/qandroid/MainActivity");
  • android/scr/com/example/MainActivity.java 頂部 package com.example.qandroid; 則代碼中必須是 QAndroidJniObject javaClass("com/qandroid/example/MainActivity");
  • 總之這個(gè)包名是和代碼中的package后面一段吻合,而不是目錄路徑。為了統(tǒng)一管理方便查找文件,建議包名和目錄路徑一致。
  1. Qt只能干Qt內(nèi)部類的事情,做一些簡(jiǎn)單的UI交互還是非常方便,如果涉及到底層操作,還是需要熟悉java會(huì)如虎添翼,一般的做法就是寫好java文件調(diào)試好,提供靜態(tài)方法給Qt調(diào)用,這樣通過QAndroidJniObject這個(gè)萬能膠水可以做到Qt程序調(diào)用java中的函數(shù)并拿到執(zhí)行結(jié)果,也可以接收java中的函數(shù)。
  2. pro中通過 OTHER_FILES = android/AndroidManifest.xml OTHER_FILES = android/src/JniMessenger.java 引入文件其實(shí)對(duì)整個(gè)程序的編譯打包沒有任何影響,就是為了方便在QtCreator中查看和編輯。
  3. 在Qt中與安卓的java文件交互都是用萬能的QAndroidJniObject,可以執(zhí)行java類中的普通函數(shù)、靜態(tài)函數(shù),可以傳類對(duì)象jclass、類名className、方法methodName、參數(shù),也可以拿到執(zhí)行結(jié)果返回值。 (I)V括號(hào)中的是參數(shù)類型,括號(hào)后面的是返回值類型,void返回值對(duì)應(yīng)V,由于String在java中不是數(shù)據(jù)類型而是類,所以要用Ljava/lang/String;表示,其他類作為參數(shù)也是這樣處理。
  • 調(diào)用實(shí)例方法:callMethod、callObjectMethod。
  • 調(diào)用靜態(tài)方法:callstaticMethod、callStaticObjectMethod。
  • 不帶Object的函數(shù)名用來執(zhí)行無返回值或者常規(guī)返回值int、float等的方法。
  • 如果返回值是String或者類則需要用帶Object的函數(shù)名來執(zhí)行,返回QAndroidJniObject類型再轉(zhuǎn)換處理拿到結(jié)果,比如toString拿到字符串。
  1. 各種參數(shù)和返回值示例。

package org.qt;import org.qt.QtAndroidData;public class QtAndroidTest{ //需要通過實(shí)例來調(diào)用 測(cè)試發(fā)現(xiàn)不論 private public 或者不寫都可以調(diào)用 我擦 private void printText() { System.out.println("printText"); } public static void printMsg() { System.out.println("printMsg"); } public static void printValue(int value) { System.out.println("printValue:" value); } public static void setValue(float value1, double value2, char value3) { System.out.println("value1:" value1 " value2:" value2 " value3:" value3); } public static int getValue() { return 65536; } public static int getValue(int value) { return value 1; } public static void setMsg(String message) { System.out.println("setMsg:" message); } public static String getMsg() { return "hello from java"; } public static void setText(int value1, float value2, boolean value3, String message) { System.out.println("value1:" value1 " value2:" value2 " value3:" value3 " message:" message); } public static String getText(int value1, float value2, boolean value3, String message) { //同時(shí)演示觸發(fā)靜態(tài)函數(shù)發(fā)給Qt QtAndroidData.receiveData("message", "你好啊 java"); //下面兩種辦法都可以拼字符串 return "value1:" value1 " value2:" value2 " value3:" value3 " message:" message; //return "value1:" String.valueOf(value1) " value2:" String.valueOf(value2) " value3:" String.valueOf(value3) " message:" message; }}``````cpp#include "androidtest.h"//java類對(duì)應(yīng)的包名 類名#define className "org/qt/QtAndroidTest"void AndroidTest::test(){ jint a = 12; jint b = 4; //可以直接調(diào)用java內(nèi)置類中的方法 jint max = QAndroidJniObject::callStaticMethod<jint>("java/lang/Math", "max", "(II)I", a, b); //jclass javaMathClass = "java/lang/Math"; jdouble value = QAndroidJniObject::callStaticMethod<jdouble>("java/lang/Math", "random"); qDebug() << "111" << max << value;}void AndroidTest::printText(){ QAndroidJniEnvironment env; jclass clazz = env.findClass(className); QAndroidJniObject obj(clazz); obj.callMethod<void>("printText");}void AndroidTest::printMsg(){#if 0 //查看源碼得知不傳入jclass類的函數(shù)中內(nèi)部會(huì)自動(dòng)根據(jù)類名查找jclass QAndroidJniEnvironment env; jclass clazz = env.findClass(className); QAndroidJniObject::callStaticMethod<void>(clazz, "printMsg");#else //沒有參數(shù)和返回值可以忽略第三個(gè)參數(shù) QAndroidJniObject::callStaticMethod<void>(className, "printMsg"); //QAndroidJniObject::callStaticMethod<void>(classNameTest, "printMsg", "()V");#endif}void AndroidTest::printValue(int value){ QAndroidJniObject::callStaticMethod<jint>(className, "printValue", "(I)I", (jint)value);}void AndroidTest::setValue(float value1, double value2, char value3){ QAndroidJniObject::callStaticMethod<void>(className, "setValue", "(FDC)V", (jfloat)value1, (jdouble)value2, (jchar)value3);}int AndroidTest::getValue(int value){ //java類中有兩個(gè) getValue 函數(shù) 一個(gè)需要傳參數(shù) //jint result = QAndroidJniObject::callStaticMethod<jint>(className, "getValue"); jint result = QAndroidJniObject::callStaticMethod<jint>(className, "getValue", "(I)I", (jint)value); return result;}void AndroidTest::setMsg(const QString &msg){ QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg); QAndroidJniObject::callStaticMethod<void>(className, "setMsg", "(Ljava/lang/String;)V", jmsg.object<jstring>());}QString AndroidTest::getMsg(){ QAndroidJniObject result = QAndroidJniObject::callStaticObjectMethod(className, "getMsg", "()Ljava/lang/String;"); return result.toString();}void AndroidTest::setText(int value1, float value2, bool value3, const QString &msg){ QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg); QAndroidJniObject::callStaticMethod<void>(className, "setText", "(IFZLjava/lang/String;)V", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>());}QString AndroidTest::getText(int value1, float value2, bool value3, const QString &msg){ QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg); QAndroidJniObject result = QAndroidJniObject::callStaticObjectMethod(className, "getText", "(IFZLjava/lang/String;)Ljava/lang/String;", (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.object<jstring>()); return result.toString();}

  1. 在原生Android開發(fā)中,不同頁(yè)面會(huì)定義不同的Activity。但使用Qt Quick、Flutter等采用Direct UI方式實(shí)現(xiàn)的第三方開發(fā)框架則只定義了一個(gè)Activity。里面不同頁(yè)面實(shí)際都是使用OpenGL等直接繪制的。https://blog.csdn.net/LCSENs/article/details/100182235

項(xiàng)目作品37-安卓綜合應(yīng)用示例 https://qtchina.blog.csdn.net/article/details/123940153

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
在線咨詢
分享本頁(yè)
返回頂部
东城区| 名山县| 新干县| 临湘市| 博兴县| 历史| 闽清县| 台南市| 潼南县| 玉屏| 延边| 台北县| 江都市| 雷州市| 广汉市| 陆良县| 商南县| 甘德县| 龙陵县| 阳新县| 上栗县| 祁阳县| 沭阳县| 元阳县| 高安市| 北宁市| 蓬安县| 吉林省| 榆林市| 贵溪市| 白河县| 宜春市| 兰考县| 天全县| 兰坪| 丽水市| 吴江市| 英德市| 周口市| 郁南县| 南安市|