Cairo库移植到安卓记录
前言
接Android Studio引入ndk编译的so库的故事,这个东西搞了两周以后,由于自己不熟悉Java和安卓开发,踩了不少坑,其中一周时间都是花在怎么用Android Studio上的。。。AS下的新版本Koala,结果网上资料全是旧版本,很多设置完全不同,遇了问题经常不知所措,后面不得已,换成了老一点的2021 dolphin版本,也学会了看安卓官网资料,逐渐才稳定下来。
好在不是紧急项目,后面赶主要任务进度就改成每周抽一天时间去处理,这个任务最核心的在于如何将cairo库移植到安卓环境去使用,这是一个2D绘图库,awtk的画布后端也有cairo的选择,几周摸爬滚打,终于将cairo移植到了安卓上,特此记录下,算是个人进军安卓开发的一小步。
环境
OS:Windows11
Cairo: 1.18.0
Android Studio: Dolphin 2021.3.1.17
NDK: r26
确保上述环境和工具已经下好,NDK用windows或者linux的都行,不过经个人测试,linux相比windows巨慢,linux下编译系统的log输出一条时间都够windows下输出十几条了,我没用虚拟机桌面系统,用的WSL,兴许是WSL本身的性能问题?
Stage1 下载Cairo,Meson编译
cairo下载地址:https://www.cairographics.org/download/
从1.17.8开始,cairo不再使用传统的configure+makefile构建系统了,而是改用一个新的构建系统meson,它的编译语法很像python,但并不像awtk的scons那样是完全基于python, 算是类python语言。
不得不接触新的编译系统多少有些抵触,不过手册和案例看下来,逐渐感觉这个系统香了,因为cairo库有很多依赖比如pixman, glib, freetype等,meson项目上有wrap脚本,在编译的时候发现依赖缺失可以直接从网上下下来特定版本。
要是旧版本的话,不只要自己一个个下依赖去配置,还要考虑依赖树内各个节点的版本兼容的问题,苦不堪言,这个自动下载的功能实在厉害!
对于交叉编译,meson可以通过编写txt文件指定特定平台的编译,我这里目标是armv7平台,给arm的平板使用。
其实还想试试x86平台的,因为AS上arm架构机型没法模拟,无法启动,查了下是电脑架构x86不好模拟arm的原因, 之前自己试过编译,结果遇到的坑根本无法解决,然后看了点科普,才知道手机x86架构算是古早的被市场淘汰的产品,除了模拟器,现在手机平板都是arm架构,看来是没有市场价值,那估计官方也没有考虑这平台,释怀了。。。。只能找arm架构的实机了,好在公司提供了个IDO-EVB3562开发板用来装安卓映像。
不废话,交叉编译设置cross_file_build_win_host_arm.txt
如下:
[constants]
android_ndk='D:\Devtools\android-ndk-r26d-win\toolchains\llvm\prebuilt\windows-x86_64\'
android_ndk_toolchain='D:\Devtools\android-ndk-r26d-win\toolchains\llvm\prebuilt\windows-x86_64\bin'[binaries]
c = android_ndk_toolchain / 'armv7a-linux-androideabi33-clang.cmd'
cpp = android_ndk_toolchain / 'armv7a-linux-androideabi33-clang++.cmd'
ar = android_ndk_toolchain / 'llvm-ar.exe'
ld = android_ndk_toolchain / 'ld.exe'
strip = android_ndk_toolchain / 'llvm-strip.exe'[properties]
sys_root = android_ndk / 'sysroot'
c_link_args = ['-fuse-ld=gold']
cpp_link_args = ['-fuse-ld=gold'][host_machine]
system = 'android'
cpu_family = 'arm'
cpu = 'armv7a'
endian = 'little'
如果linux平台上则是:
[constants]
android_ndk='/mnt/d/Devtools/android-ndk-r26d-linux/toolchains/llvm/prebuilt/linux-x86_64/'
android_ndk_toolchain='/mnt/d/Devtools/android-ndk-r26d-linux/toolchains/llvm/prebuilt/linux-x86_64/bin'[binaries]
c = android_ndk_toolchain / 'armv7a-linux-androideabi33-clang'
cpp = android_ndk_toolchain / 'armv7a-linux-androideabi33-clang++'
ar = android_ndk_toolchain / 'llvm-ar'
ld = android_ndk_toolchain / 'ld'
strip = android_ndk_toolchain / 'llvm-strip'[properties]
sys_root = android_ndk / 'sysroot'
c_link_args = ['-fuse-ld=gold']
cpp_link_args = ['-fuse-ld=gold'][host_machine]
system = 'android'
cpu_family = 'arm'
cpu = 'armv7a'
endian = 'little'
注意windows版我指定了后缀名,因为meson实际上是脚本,根据路径的文件名执行对应文件,给脚本提供的实际是文件路径。
以下指令启动meson的编译,--cross-file
用于指定交叉编译文件
meson setup --cross-file cross_file_build_win_host_arm.txt build_win_host_arm
等待一段时间,让meson把一切配置好,最后meson会弹出项目的各项配置总结:
cairo 1.18.0Surface BackendsImage : YESRecording : YESObserver : YESMime : YESTee : YESXlib : NOXlib Xrender : NOQuartz : NOQuartz-image : NOXCB : NOWin32 : NOCairoScript : YESPostScript : YESPDF : YESSVG : YESFont BackendsUser : YESFreeType : YESFontconfig : YESWin32 : NOWin32 DWrite : NOQuartz : NOFunctionsPNG functions : YESX11-xcb : NOXCB-shm : NOFeatures and Utilitiescairo-trace: : NOcairo-script-interpreter: YESAPI reference : NOSubprojectsfontconfig : YESfreetype2 : YES (from fontconfig)glib : NO Dependency "iconv" not found, tried builtin and systemgperf : YES (from fontconfig)libintl : NO Include dir /usr/local/include does not exist.libpng : YESlibxml2 : YES (from fontconfig)pixman : YESUser defined optionsCross files : cross_file_build_win_host_arm.txt
Found ninja-1.12.1 at D:\Devtools\Meson\ninja.EXE
接下来就加入meson的第二阶段:ninja编译:
ninja -C build_win_host_arm
到了这一步开始编译就开始不风顺了,中间一定会遇到某些问题,比如头文件缺失,或者源码的哪些不规范用法在gcc上过得去,到了ndk的clang就撞error,或者丢了哪些库,不过只要不是系统性问题基本都能解决。我这里先不讲,问题放在最后的踩坑上记录。
Stage2 Cairo安卓项目
ninja编译完成后应该会有以下so库,这些库都要放到后面安卓项目的libs文件夹上,缺一不可。
除了libcpufeatures.so是在ndk内部,其他库应该都能在build_win_host_arm内找到。
libcairo.so
libcpufeatures.so
libfontconfig.so
libfreetype.so
libglib-2.0.so
libintl.so
libpcre2-8.so
libpixman-1.so
libpng16.so
libxml2.so
Android Studio新建NativeC++项目, 后面就是各种配置了, 然而自己不懂安卓开发,在编码实现上还是一头雾水,结果网上一查,其实已经有人把cairo的移植做出来了,把源码适配了下,居然能用。Nice, 那不担心了。
省篇幅,我就直接发源码吧:https://gitee.com/tracker647/cairo-for-android
记录一些注意点:
1.CMake版本务必换成更新的3.22.1,否则不识别编译选项,一些库明明加了硬说没有。
2.adbFilter选项,由于这里用的armv7a,则只指定armv7a就行了。
根据1 2修改后的build.gradle的android部分例:
android {namespace 'com.example.cairotest'compileSdk 32defaultConfig {applicationId "com.example.cairotest"minSdk 24targetSdk 32versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"ndk {abiFilters 'armeabi-v7a'}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'}}buildFeatures {viewBinding true}
}
3.cairo官方提供了一些编码案例,我用的其中一个画星星的例子,画的时候注意看有没有cairo_scale这个函数,这是用来控制整个坐标系放缩的,比如设置了cario_scale(width, height), 后面各种api传坐标就不用加width和height了,直接传百分比就行,用的移植例子一开始没注意,画出来结果一脸懵逼。
最终效果图,桌面是cairo在ubuntu wsl平台的运行结果,平板(IDO-EVB3562开发板连了个电容屏)是安卓平台运行结果。
ninja踩坑
tips:-v
打开指令log:
ninja -C $builddir -v
💥**…\subprojects\fontconfig\src/fcint.h:32:10: fatal error: ‘fcstdint.h’ file not found**
一个简单的封装stdint.h的头文件缺失,补全即可,我是拿的其他平台的build文件夹去补的,就奇怪,我在其他平台上这个文件生成的好好的,为什么到了这里就没了?
💥**…/subprojects/pixman/pixman/pixman-arm.c:99:10: fatal error: ‘cpu-features.h’ file not found**
这个文件依赖于ndk的cpufeatures库,正好ndk的cpufeatures文件夹提供了mk文件,直接编译即可,不过生成的是静态库,我这里图后期用的库格式一致改成动态库了。
cd到这个文件夹然后ndk-build
:
PS D:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures> ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk
接着就会生成libs和objs文件夹,libs和objs文件夹下有目标库,现在切回到cairo项目,build_linux_host_arm
文件夹下有个build.ninja是ninja执行时用的脚本,CV报错指令找到对应command, 把cpu_features头文件加入:
build subprojects/pixman/pixman/libpixman-1.so.p/pixman-arm.c.o: c_COMPILER …/subprojects/pixman/pixman/pixman-arm.c
DEPFILE = “subprojects\pixman\pixman\libpixman-1.so.p\pixman-arm.c.o.d”
DEPFILE_UNQUOTED = subprojects\pixman\pixman\libpixman-1.so.p\pixman-arm.c.o.d
ARGS = “-Isubprojects\pixman\pixman\libpixman-1.so.p” “-Isubprojects\pixman\pixman” “-I…\subprojects\pixman\pixman” “-ID:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures” “-fdiagnostics-color=always” “-D_FILE_OFFSET_BITS=64” “-Wall” “-Winvalid-pch” “-Wextra” “-std=gnu99” “-O0” “-g” “-Wdeclaration-after-statement” “-fno-strict-aliasing” “-fvisibility=hidden” “-Wundef” “-ftrapping-math” “-Wno-unused-local-typedefs” “-DHAVE_CONFIG_H” “-fPIC” “-pthread”
头文件的错误就过去了,接下来链接指令,由于未加入cpufeatures库,必定报错:
💥**…/subprojects/pixman/pixman/pixman-arm.c:108: error: undefined reference to ‘android_getCpuFamily’**
…/subprojects/pixman/pixman/pixman-arm.c:109: error: undefined reference to ‘android_getCpuFeatures’
build.ninja
找到对应链接指令,指定库路径, libs和objs都可以,注意架构,这个例子是armv7a:
build subprojects/pixman/pixman/libpixman-1.so: c_LINKER_RSP subprojects/pixman/pixman/libpixman-1.so.p/pixman.c.o subprojects/pixman/pixman/libpixman-1.so.p/pixman-access.c.o
。。。
subprojects/pixman/pixman/libpixman-arm-neon.a subprojects/pixman/pixman/libpixman-arm-simd.a
LINK_ARGS = “D:\Devtools\android-ndk-r26d-win\sources\android\cpufeatures\libs\armeabi-v7a\cpufeatures.so” “-Wl,–as-needed” “-Wl,–no-undefined” “-shared” “-fPIC” “-Wl,-soname,libpixman-1.so” “-fuse-ld=gold” “-Wl,–start-group” “subprojects/pixman/pixman/libpixman-arm-simd.a” “subprojects/pixman/pixman/libpixman-arm-neon.a” “-lm” “-Wl,–end-group” “-pthread”
💥**— stderr —**
Traceback (most recent call last):
File “D:\MyCodeBase\KChartSimulate\cairo-1.18.0\build_win_host_arm\subprojects\glib-2.74.0\gobject\glib-mkenums”, line 486, in
write_output(prod)
File “D:\MyCodeBase\KChartSimulate\cairo-1.18.0\build_win_host_arm\subprojects\glib-2.74.0\gobject\glib-mkenums”, line 97, in write_output
print(output, file=output_stream)
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa9’ in position 17: illegal multibyte sequence
windows系统下特供错误,版权符号©没有gbk编码,而windows终端就是gdb编码输出中文的,这个卡住过一段时间,试过输入chcp 65001
也没用,网上没合理答案,找glib的gitlab提issue也没人理,最后还是问ai找到了解决方法,把这个符号直接替换掉:
def write_output(output):global output_streamoutput = output.replace('\xa9', '')print(output, file=output_stream)
**💥…/subprojects/glib-2.74.0/gio/gsocket.c:497:37: error: passing ‘guint *’ (aka ‘unsigned int *’) to parameter of type 'socklen_t ’ (aka 'int ') converts between pointers to integer types with different sign [-Werror,-Wpointer-sign]
修改build.ninja把-Wpointer-sign去除掉, 或者直接修改源码加入强转,不过十几条error,不值得。
build subprojects/glib-2.74.0/gio/libgio-2.0.so.p/gsocket.c.o: c_COMPILER …/subprojects/glib-2.74.0/gio/gsocket.c || subprojects/glib-2.74.0/gio/gdbus-daemon-generated.h subprojects/glib-2.74.0/gio/gioenumtypes.h subprojects/glib-2.74.0/gio/xdp-dbus.h subprojects/glib-2.74.0/gobject/glib-enumtypes.h
DEPFILE = “subprojects\glib-2.74.0\gio\libgio-2.0.so.p\gsocket.c.o.d”
DEPFILE_UNQUOTED = subprojects\glib-2.74.0\gio\libgio-2.0.so.p\gsocket.c.o.d
ARGS = “-Isubprojects\glib-2.74.0\gio\libgio-2.0.so.p” “-Isubprojects\glib-2.74.0\gio” “-I…\subprojects\glib-2.74.0\gio” “-Isubprojects\glib-2.74.0” “-I…\subprojects\glib-2.74.0” “-Isubprojects\glib-2.74.0\glib” “-I…\subprojects\glib-2.74.0\glib” “-Isubprojects\proxy-libintl” “-I…\subprojects\proxy-libintl” “-Isubprojects\glib-2.74.0\gobject” “-I…\subprojects\glib-2.74.0\gobject” “-Isubprojects\glib-2.74.0\gmodule” “-I…\subprojects\glib-2.74.0\gmodule” “-Isubprojects\glib-2.74.0\subprojects\gvdb” “-I…\subprojects\glib-2.74.0\subprojects\gvdb” “-fdiagnostics-color=always” “-D_FILE_OFFSET_BITS=64” “-Wall” “-Winvalid-pch” “-Wextra” “-Wpedantic” “-std=gnu99” “-O0” “-g” “-D_GNU_SOURCE” “-fno-strict-aliasing” “-DG_ENABLE_DEBUG” “-Wimplicit-fallthrough” “-Wmisleading-indentation” “-Wunused” “-Wno-unused-parameter” “-Wno-cast-function-type” “-Wno-pedantic” “-Wno-format-zero-length” “-Wno-variadic-macros” “-Werror=format=2” “-Werror=init-self” “-Werror=missing-include-dirs” “-Werror=pointer-arith” “-Werror=unused-result” “-Wstrict-prototypes” “-Wno-bad-function-cast” “-Werror=declaration-after-statement” “-Werror=implicit-function-declaration” “-Werror=missing-prototypes” “-Werror=pointer-sign” “-fPIC” “-DG_LOG_DOMAIN=“GLib-GIO”” “-DGIO_COMPILATION” “-DGIO_LAUNCH_DESKTOP=“c:/libexec/gio-launch-desktop”” “-DGIO_MODULE_DIR=“c:/lib/gio/modules”” “-DLOCALSTATEDIR=“c:/var”” “-fvisibility=hidden”
相关文章:

Cairo库移植到安卓记录
前言 接Android Studio引入ndk编译的so库的故事,这个东西搞了两周以后,由于自己不熟悉Java和安卓开发,踩了不少坑,其中一周时间都是花在怎么用Android Studio上的。。。AS下的新版本Koala,结果网上资料全是旧版本&…...
Redis 哈希类型的常用命令总结
1. hset 设置哈希表中字段的值。 hset key field value示例: hset user:1000 name "Alice"2. hget 获取哈希表中字段的值。 hget key field示例: hget user:1000 name3. hgetall 获取哈希表中所有的字段和值。 hgetall key示例&#x…...
【物联网设备端开发】ESP开发工具:QEMU如何模拟以太网口接入网络
以太网口支持 ESP-IDF中添加了对Opencores以太网MAC的支持。 运行以太网示例时,启用CONFIG_EXAMPLE_CONNECT_ETHERNET和 CONFIG_EXAMPLE_USE_OPENETH.。运行自定义应用程序时,启用CONFIG_ETH_USE_OPENETH 并初始化以太网驱动程序,如示例 /c…...
Python学习笔记(四)
# 数据容器分为5类,分别是:列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)""" 演示数据容器之:list列表 语法:[元素ÿ…...
跨域:安全分步实施指南
什么是跨域问题? 跨域(Cross-Origin Resource Sharing,CORS)问题发生在浏览器的同源策略(Same-Origin Policy)限制下。当一个域上的网页试图访问另一个域上的资源时,浏览器会阻止这些操作以保护…...

【iOS】AutoreleasePool自动释放池的实现原理
目录 ARC与MRC项目中的main函数自动释放池autoreleasepool {}实现原理AutoreleasePoolPage总结 objc_autoreleasePoolPush的源码分析autoreleaseNewPageautoreleaseFullPageautoreleaseNoPage autoreleaseFast总结 autorelease方法源码分析objc_autoreleasePoolPop的源码分析po…...

stm32—GPIO
0. 引入 在单片机产品中,我们常常可以见到三种模块:LCD灯、KEY按键、BEEP蜂鸣器 LED灯: 一个比较常见的LED电路LED0 ---------- 通过控制LED0引脚(电线) 给它一个低电平(低电压),LED灯就会亮 给它一个高电平(高电压),LED灯就会灭 …...

CocosCreator使用 ProtoBuf WebSocket与服务器对接方法
在 Cocos Creator 中使用 .proto 文件和转换成 TypeScript(TS)两者各有其优缺点,具体选择取决于你的项目需求和团队的开发习惯。以下是两者的一些比较: 1、使用 .proto 文件的优点: 跨语言支持:Protocol B…...
【python基础】while循环语句练习
明显可以感觉到循环比判断要更加难以理解一些,这个就只能通过练习来提高理解和思维能力了。 学习视频:第一阶段-第四章-05-while循环案例-九九乘法表_哔哩哔哩_bilibili 练习一:计算1-10的和 i1#循环的起始值 sum0 while i&l…...

【SpringBoot系列】WebMvcConfigurer配置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
学懂C++ (十九):高级教程——深入详解C++信号处理
目录 C中的信号处理 1. 信号处理的本质 2. 主要信号类型 3. 核心关键点 4. 经典实例 代码分析 5. 进阶:信号屏蔽与多线程 例子:使用sigaction() 6. Windows中的信号处理 7. 比较与总结 示例:Windows控制台事件处理 总结 C中的信号…...

SOMEIP_ETS_032:echoUINT8ArrayMinSize
测试目的: 确保DUT能够正确处理最小尺寸的UINT8数组参数,并且在发送和接收过程中保持参数值和顺序不变。 描述 本测试用例旨在验证DUT在处理包含最小尺寸UINT8数组参数的SOME/IP消息时,是否能够准确地发送和接收这些参数,确保返…...

JS+CSS案例:可适应上下布局和左右布局的菜单(含二级菜单)
今天,我给大家分享一个原创的CSS菜单,整个菜单全由CSS写成,仅在切换布局时使用JS。合不合意,先看看效果图。 本例图片 接下来,我来详细给大家分享它的制作方法。 文件夹结构 因为涉及到了样式表切换,所以,你需要借鉴一下我的文件夹结构。 CSS文件夹: reset.css 用于…...

【数据结构】线性表,顺序表
一. 线性表 1. 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 2. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 3. 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理…...

Spring之最基础的创建与Bean的存储与获取(还有Maven加载jar包报错的解决方法)
目录 创建Spring项目 如何解决Maven加载jar包报错 存储Bean和取Bean 在Java中对象也称为Bean。所以后面我提到Bean,大家要知道我说的是什么。 创建Spring项目 我的idea是2022版本的,如果大家和我一样可以参考我的。 1.创建一个Maven项目。图片上忘了…...

RabbitMQ应用问题 - 消息顺序性保证、消息积压问题
文章目录 MQ 消息顺序性保证概述原因分析解决方案基于 spring-cloud-stream 实现分区消费 消息挤压问题概述原因分析解决方案 MQ 消息顺序性保证 概述 a)消息顺序性:消费者消费的消息的顺序 和 生产者发送消息的顺序是一致的. 例如 生产者 发送消息顺序…...
linux tcp通讯demo
linux tcp通讯demo代码。通过用chatgpt生成的代码。做一个代码记录。 一、基本的通讯demo server.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h>…...
在 MongoDB 中,如何配置副本集以实现读写分离?
在 MongoDB 中,配置副本集以实现读写分离主要涉及以下几个步骤: 初始化副本集: 创建副本集时,需要在所有参与节点上运行 rs.initiate() 命令。这将初始化一个新的副本集。 添加成员到副本集: 使用 rs.add() 命令将所有…...

虚拟dom-Diff算法
虚拟dom-Diff算法 vue2 diff算法在vue2中就是patch,通过新旧虚拟dom对比,找到最小变化然后进行dom操作 在页面首次渲染的时候会调用一次patch并创建新的vnode,不会进行深层次的比较,然后再组件中数据发生变化的时候,…...

01创建型设计模式——单例模式
一、单例模式简介 单例模式(Singleton Pattern)是一种创建型设计模式(GoF书中解释创建型设计模式:一种用来处理对象的创建过程的模式),单例模式是其中的一种,它确保一个类只有一个实例ÿ…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...