当前位置: 首页 > news >正文

合江做网站软装设计专业

合江做网站,软装设计专业,有哪些做短租的网站,网站开发与服务器交互01#xff1a;01-05 pro中引入安卓拓展模块 QT androidextras 。pro中指定安卓打包目录 ANDROID_PACKAGE_SOURCE_DIR $$PWD/android 指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。 AndroidManifest.xml 每个程序唯一的一个全局配置文件01-05 pro中引入安卓拓展模块 QT androidextras 。pro中指定安卓打包目录 ANDROID_PACKAGE_SOURCE_DIR $$PWD/android 指定引入安卓特定目录比如程序图标、变量、颜色、java代码文件、jar库文件等。 AndroidManifest.xml 每个程序唯一的一个全局配置文件里面xml格式的数据标明支持的安卓版本、图标位置、横屏竖屏、权限等。这个文件是最关键的如果没有这个文件则Qt会默认生成一个。android/res/drawable-hdpi drawable-xxxhdpi 等目录下存放的是应用程序图标。android/res/layout 目录下存放的布局文件。android/res/values/libs.xml 存储的一些变量值。android/libs 目录下存放的jar库文件。android/src 目录下存放的java代码文件可以是根据包名建立的一层层子目录也可以直接在src目录下。其他目录自行搜索安卓目录规范。后面的说明统一用的android目录举例其实你可以改成任意目录比如你的代码目录下是xxoo存放的安卓相关的打包文件你就写成 ANDROID_PACKAGE_SOURCE_DIR $$PWD/xxoo 。 java类名必须和文件名完全一致区分大小写。java类必须在android/src目录下不然不会打包到apk文件可以是子目录比如 android/src/com/qt 。Qt代码中的QAndroidJniObject指定传入的java包名必须严格和java文件package完全一致不然程序执行到此处会因为找不到而崩溃。 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”);总之这个包名是和代码中的package后面一段吻合而不是目录路径。为了统一管理方便查找文件建议包名和目录路径一致。 0206-10 Qt只能干Qt内部类的事情做一些简单的UI交互还是非常方便如果涉及到底层操作还是需要熟悉java会如虎添翼一般的做法就是写好java文件调试好提供静态方法给Qt调用这样通过QAndroidJniObject这个万能胶水可以做到Qt程序调用java中的函数并拿到执行结果也可以接收java中的函数。pro中通过 OTHER_FILES android/AndroidManifest.xml OTHER_FILES android/src/JniMessenger.java 引入文件其实对整个程序的编译打包没有任何影响就是为了方便在QtCreator中查看和编辑。在Qt中与安卓的java文件交互都是用万能的QAndroidJniObject可以执行java类中的普通函数、静态函数可以传类对象jclass、类名className、方法methodName、参数也可以拿到执行结果返回值。 (I)V括号中的是参数类型括号后面的是返回值类型void返回值对应V由于String在java中不是数据类型而是类所以要用Ljava/lang/String;表示其他类作为参数也是这样处理。 调用实例方法callMethod、callObjectMethod。调用静态方法callStaticMethod、callStaticObjectMethod。不带Object的函数名用来执行无返回值或者常规返回值int、float等的方法。如果返回值是String或者类则需要用带Object的函数名来执行返回QAndroidJniObject类型再转换处理拿到结果比如toString拿到字符串。 各种参数和返回值示例。 package org.qt; import org.qt.QtAndroidData;public class QtAndroidTest {//需要通过实例来调用 测试发现不论 private public 或者不写都可以调用 我擦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){//同时演示触发静态函数发给QtQtAndroidData.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;} }#include androidtest.h//java类对应的包名类名 #define className org/qt/QtAndroidTestvoid AndroidTest::test() {jint a 12;jint b 4;//可以直接调用java内置类中的方法jint max QAndroidJniObject::callStaticMethodjint(java/lang/Math, max, (II)I, a, b);//jclass javaMathClass java/lang/Math;jdouble value QAndroidJniObject::callStaticMethodjdouble(java/lang/Math, random);qDebug() 111 max value; }void AndroidTest::printText() {QAndroidJniEnvironment env;jclass clazz env.findClass(className);QAndroidJniObject obj(clazz);obj.callMethodvoid(printText); }void AndroidTest::printMsg() { #if 0//查看源码得知不传入jclass类的函数中内部会自动根据类名查找jclassQAndroidJniEnvironment env;jclass clazz env.findClass(className);QAndroidJniObject::callStaticMethodvoid(clazz, printMsg); #else//没有参数和返回值可以忽略第三个参数QAndroidJniObject::callStaticMethodvoid(className, printMsg);//QAndroidJniObject::callStaticMethodvoid(classNameTest, printMsg, ()V); #endif }void AndroidTest::printValue(int value) {QAndroidJniObject::callStaticMethodjint(className, printValue, (I)I, (jint)value); }void AndroidTest::setValue(float value1, double value2, char value3) {QAndroidJniObject::callStaticMethodvoid(className, setValue, (FDC)V, (jfloat)value1, (jdouble)value2, (jchar)value3); }int AndroidTest::getValue(int value) {//java类中有两个 getValue 函数 一个需要传参数//jint result QAndroidJniObject::callStaticMethodjint(className, getValue);jint result QAndroidJniObject::callStaticMethodjint(className, getValue, (I)I, (jint)value);return result; }void AndroidTest::setMsg(const QString msg) {QAndroidJniObject jmsg QAndroidJniObject::fromString(msg);QAndroidJniObject::callStaticMethodvoid(className, setMsg, (Ljava/lang/String;)V, jmsg.objectjstring()); }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::callStaticMethodvoid(className, setText, (IFZLjava/lang/String;)V, (jint)value1, (jfloat)value2, (jboolean)value3, jmsg.objectjstring()); }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.objectjstring());return result.toString(); }在原生Android开发中不同页面会定义不同的Activity。但使用Qt Quick、Flutter等采用Direct UI方式实现的第三方开发框架则只定义了一个Activity。里面不同页面实际都是使用OpenGL等直接绘制的。https://blog.csdn.net/LCSENs/article/details/100182235 0311-15 安卓中一个界面窗体对应一个Activity多个界面就有多个Activity而在Qt安卓程序中Qt这边只有一个Activity那就是QtActivity包名全路径 org.qtproject.qt5.android.bindings.QtActivity这个QtActivity是固定的写好的整个Qt程序都是在这个QtActivity界面中。你打开AndroidManifest.xml文件可以看到对应节点有个nameorg.qtproject.qt5.android.bindings.QtActivity所以如果要让Qt程序能够更方便通畅的与对应的java类进行交互需要上下文传递Activity的比如震动消息提示等建议新建一个java类继承自QtActivity即可这样相当于默认Qt启动的就是你java类中定义的Activity可以很好的控制和交互。 由于AndroidManifest.xml文件每个程序都可能不一样为了做成通用的组件这就要求可能不能带上AndroidManifest.xml文件这样的话每个Qt安卓程序都启动默认内置的Activity如果依赖Activity上下文的执行函数需要传入Qt的Activity才行这里切记Qt的Activity包名是 Lorg/qtproject/qt5/android/bindings/QtActivity; 之前顺手想当然的写的 Landroid/app/Activity; 发现死活不行原来是包名错了。 一个Qt安卓程序中可以有多个Java类包括继承自Activity的类这样的Activity可以通过QtAndroid::startActivity函数来调用但是只能有一个通过AndroidManifest.xml文件指定的Activity不指定会默认一个。如果java类中不需要拿到Qt的Activity进行处理的可以不需要继承任何Activity比如全部是运算的静态函数。 在java类中如果上面没有主动引入包名则下面需要写全路径引入了则不需要全路径可以直接用包括枚举值都可以直接写比如 VIBRATOR_SERVICE 这种枚举值引入了包名后不需要写android.content.Context.VIBRATOR_SERVICE建议引入包名比如上面写了 import org.qtproject.qt5.android.bindings.QtActivity; 则下面继承类可以直接写 public class QtAndroidActivity extends QtActivity如果没有引入则需要写成 public class QtAndroidActivity extends org.qtproject.qt5.android.bindings.QtActivity 。 建议搭配 android studio 工具开发因为在 android studio 中写代码都有自动语法提示包名会提示自动引入可以查看有那些函数方法等还可以校验代码是否正确而如果在QtCreator中手写有时候可能会写错尤其是某个字母写错当然这种错误是编译通不过的会提示错误在哪行。 0416-20 用Qt做安卓开发最大难点两个第一个就是传参数这些奇奇怪怪的字符Ljava/lang/String;啥意思如何对应这也不是Qt故意为难初学者啥的因为这套定义机制是安卓系统底层要求的系统层面定义的一套规范其实这个在帮助文档中写的很清楚都有数据类型对照表用熟悉了几次就很简单了。第二个难点就是用java写对应的类如果是会安卓开发的人来说那不要太简单尤其是搜索那么方便一大堆没有搞过安卓开发的人来说就需要学习下这个没有捷径只是希望Qt能够尽可能最大化的封装一些可以直接使用的类比如后期版本就提供了权限申请的类 QtAndroid::requestPermissionsSync 之类的用起来就非常的爽不用自己写个java类调来调去的。 理论上来说按照Qt提供的万能大法类QAndroidJniObject可以不用写java类也能执行各种处理拿到安卓库中的属性和执行方法就是写起来太绕太费劲在java类中一行代码这里起码三行所以终极大法就是熟悉安卓开发直接封装好java类进行调用。 测试发现GetStringUTFChars方法对应的数据字符串中不能带有temp字样否则解析有问题不知什么原因。 数据类型参数和返回值类型必须完全一致否则执行会提示找不到对应的函数有返回值一定要写上返回值。 jar文件对包名的命名没有要求只要放在android/libs目录下即可安卓底层是通过包名去查找而不是通过文件名你甚至可以将原来的包名重新改成也可以正常使用比如classes.jar改成test.jar也能正常使用。 0521-25 关于权限设置在早期的安卓版本所有权限都写在全局配置文件AndroidManifest.xml中这种叫安装时权限就是安装的时候告诉安卓系统当前app需要哪些权限。大概从安卓6开始部分权限需要动态申请这种叫动态权限这种申请到的权限也可以动态撤销就是要求程序再次执行代码去向系统申请权限比如拍照、存储读写等。也不是所有的权限都改成了动态申请意味着兼容安卓6以上的系统你既要在AndroidManifest.xml中写上要求的权限也要通过checkPermission申请你需要的权限。 android studio 新建并生产jar包步骤。 第一步文件File-》新建new-》项目new project-》空白窗体empty activity。第二步刚才新建好的项目鼠标右键新建new-》模块new module-》安卓库android library。说明如果选择的不是安卓库android library而是java库Java Library则直接编译出来的就是jar文件默认包名 com.example.lib.MyClass。推荐选择java库编译后不用去一堆文件中找jar文件。第三步写好库名字根据项目需要选择好最低sdk版本-》完成。第四步在刚才新建好的库项目mylibrary依次找到子节点src/main/java/com.example.mylibrary上鼠标右键新建-》class类。切记是这个节点不是java节点或者其他节点。第五步写好你的类方法函数等。 package com.example.mylibrary; public class Test {public static int add(int a, int b) {return a b;} }第六步选中库项目mylibrary菜单执行编译build-》编译库make module xxx。第七步此时在mylibrary/build目录下有outputs目录和intermediates目录其中outputs/aar目录下是生成的Android库项目的二进制归档文件包含所有资源class以及res资源文件全部包含。有时候我们仅仅需要jar文件只包含了class文件与清单文件 不包含资源文件如图片等所有res中的文件。需要到intermediates/aar_main_jar/debug目录下可以看到classes.jar将这个拷贝出来使用即可。当然你也可以对刚才的aar文件用解压缩软件解压出来也能看到classes.jar是同一个文件。其他调用jar包非常简单只需要将jar文件放在你的项目的libs目录下即可对应的包名和函数一般jar包提供者会提供没有提供的话可以在android studio中新建空白项目切换到project视图找到libs目录鼠标右键最下面作为包动态库添加到项目导入包完成以后会自动在libs目录列出双击刚刚导入的包然后就自动列出对应的类和函数。 Qt安卓使用jar包步骤。 第一步将classes.jar放到android/libs目录下为啥是这个目录因为这是安卓的规则约定这个目录就是放库文件放在这个目录下的文件会自动打包编译到apk文件中。第二步调用jar文件之前前提是你知道jar文件中的函数详细信息这个一般jar提供者会提供好手册如果代码没有混肴的话你可以在android studio中双击打开查阅具体的函数。第三步如果jar文件中的函数简单直接拿到结果不需要绕来绕去可以直接写Qt类来调用如果还是很复杂建议再去新建java类处理完再交给Qt当然也可以让jar的作者尽可能封装函数的时候就做好尽量提供最简单的接口返回需要的数据。比如返回图片数据可以做成jar内部存储好图片然后返回图片路径即可不然有些数据转换也挺烦。第四步编写最终的调用函数。 int AndroidJar::add(int a, int b) { #ifdef Q_OS_ANDROIDconst char *className com/example/mylibrary/Test;jint result QAndroidJniObject::callStaticMethodjint(className, add, (II)I, (jint)a, (jint)b);return result; #endif }Qt6中对安卓支持部分做了大的改动目前还不完善如果是不涉及到与java交互的纯Qt项目可以正常移植涉及到的暂时不建议移植到Qt6等所有类完善了再说。 移除了安卓插件androidextras将其中部分功能类移到core模块中不需要额外引入。类名发生了变化比如QAndroidJniObject改成了QJniObject、QAndroidJniEnvironment改成了QJniEnvironment可能是为了统一移动开发平台类弱化安卓的影响。对应的安卓jdk要用jdk11而不是jdk1.8Qt5.15两个都支持建议就统一用jdk11。对应封装的java类包名去掉了qt5标识org.qtproject.qt5.android.bindings.QtActivity改成了org.qtproject.qt.android.bindings.QtActivity、org.qtproject.qt5.android.bindings.QtApplication改成了org.qtproject.qt.android.bindings.QtApplication。对安卓最低sdk有要求所以建议在配置AndroidManifest.xml文件的时候不要带上最低版本要求。对AndroidManifest.xml文件内容有要求之前Qt5安卓的不能在Qt6安卓下使用具体内容参见示例下的文件。对应示例demo在 C:\Qt\Examples\Qt-6.3.0\corelib\platform 目录下之前是 C:\Qt\Examples\Qt-5.15.2\androidextras 目前就一个示例可能因为其他类还没有移植好。Qt6中安卓模块介绍在这里 https://doc.qt.io/qt-6/qtandroidprivate.html 如果想要安卓全屏遮挡住顶部状态栏可以在main函数中将show改成showFullScreen即可当然也可以采用java的方式在onCreate函数中加一行 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 0625-30 横竖屏切换的识别在Qt中会同时反映到resizeEvent事件中你可以在这个是尺寸变化后读取下当前屏幕是横屏还是竖屏然后界面上做出调整比如上下排列改成左右排列。 由于不同Qt版本对应的安卓配置文件 AndroidManifest.xml 内容格式不一样高版本和低版本模板格式互不兼容所以建议使用自己的Qt版本创建的 AndroidManifest.xml 文件创建好以后如果使用的是自己重新定义的java文件的启动窗体则需要将 AndroidManifest.xml 文件中的 android:name“org.qtproject.qt5.android.bindings.QtActivity” 换掉就行。 如果自己用android studio编译的jar文件放到Qt项目的libs目录下导致编译通不过提示 com.android.dx.cf.iface.ParseException: bad class file magic 之类的那是因为jdk版本不一致导致的你可能需要在android studio项目中找到模块编jdk版本设置的地方降低版本比如你用的ndk是r14则需要选择jdk1.6或者jdk1.7。一般来说高版本兼容低版本因为ndk版本太低无法兼容jdk1.8。后面发现如果直接新建的是java库Java Library则不存在这个问题如果选择的是安卓库android library就可能有这个问题。 安卓项目配置文件是固定的名字 AndroidManifest.xml 改成其他名字就不认识不要想当然改成其他名字导致无法正常识别。 AndroidManifest.xml文件中的packageorg.qtproject.example是包名也是整个apk程序的内部唯一标识如果多个apk这个包名一样则会覆盖所以一定要注意不同的程序记得把这个包名改成你自己的。这个包名也决定了java文件中需要使用资源文件时候的引入包名 import org.qtproject.example.R; 如果包名不一样则编译都通不过。 新版的qtc搭建安卓开发环境非常简单早期版本的非常复杂要东下载西下载折腾好多天才行。现在只需要安装jdk文件jdk_8.0.1310.11_64.exe全部默认一步到位然后在qtc中安卓配置界面设置jdk的安装目录。然后打开 D:\Qt\Qt6\Tools\QtCreator\share\qtcreator\android\sdk_definitions.json 和 C:\Users\Administrator\AppData\Roaming\QtProject\qtcreator\android\sdk_definitions.json将里面的 cmdline-tools;latest 修改为 cmdline-tools;6.0 这一步非常关键默认是latest导致待会自动下载sdk/ndk的时候会下载不全。改好以后设置sdk保存目录单击右侧的 Set Up SDK 按钮自动下载一堆文件最后下面有个openssl的目录文件也设置下。该文件网上可以非常简单就能直接下载到右侧就有按钮单击打开下载页面。然后就可以开始愉快的安卓开发之旅了。 项目大全 https://qtchina.blog.csdn.net/article/details/97565652
http://www.hkea.cn/news/14343289/

相关文章:

  • 好的网站建设启示完整的软件开发流程
  • seo工具助力集群式网站升级连云港网站建设 连云港网站制作
  • 营销型网站如何制作一个网站多大
  • 湖南网站建设设计网站开发手机自适应
  • 网站域名收费吗asp网站模板安装
  • 烟台高端网站开发微营销软件免费下载
  • 网站建设调研报告高仿微博wordpress
  • 网站色彩搭配营销型网站建设的五力原则
  • 免费注册网站怎么做链接网站开发的账务处理
  • 鞍山网站制作三牛网络推广
  • 公司网站维护主要做什么深圳电商页面设计那家好
  • 网站的视频网站seo策划方案案例分析
  • 营销型网站seo公司网站域名如何申请
  • 网站搭建策划书自己做网站的网址
  • 我的世界是怎么做的视频网站旅游做攻略网站好
  • 无锡网站制作电话多少深圳市龙华区民治街道
  • 代码编辑器做热点什么网站好网站开发主要技术路线
  • 上海平台网站建设哪家有学做网站要代码
  • 在网站中搜索关键字建立网站的技术
  • 苏州网站建设品牌公司麻豆秋白色蕾丝半身裙
  • 企业网站管理系统c郑州企业健康码二维码怎么申请
  • 电子商务网站建设的首要问题搜索网站排名优化
  • 大画册设计网站网页设计教程多少钱
  • 建设我们的网站教案租车网站模板下载
  • 网站建设新闻asp网站 证书
  • 建各企业网站多少钱网站备案就是合法的
  • 延边省建设局网站官网中国建设人才专业服务网
  • 网站建设的要点网站免费创建
  • 长春网站优化常识做内容的网站
  • 工业和信息化部icp网站备案系统西服定制一般多少钱