Android编译snowboy

如果Ubuntu是新创建的,可以安装build-essential软件包

sudo apt install build-essential

该命令将安装一堆新软件包,包括gcc,g++和make。

一、Ubuntu安装git

1.打开终端

在Ubuntu系统中,我们可以使用终端输入命令进行操作。打开终端的快捷键为Ctrl+Alt+T。

2.安装Git

在终端中输入以下命令,即可开始安装Git。

sudo apt-get install git

登录后复制

安装过程中需要输入管理员密码,安装完成后,终端会输出Git的版本号等信息。

3.验证Git是否安装成功

安装完成后,我们可以使用以下命令检验Git是否已经成功安装。

git --version

如果终端输出以下信息,则说明Git已经安装成功。

4.设置Git的全局配置

在使用Git前,我们需要先对Git进行一些基本的配置。使用以下命令进行用户名和Email的配置。请将username和email替换成你自己的用户名和Email。

git config --global user.name "username" 
git config --global user.email "email"

配置完成后,我们可以使用以下命令检查配置是否生效。

git config --list

二、快捷键

Ctrl+h 切换是否显示隐藏文件。

说明

.bashrc是bash shell启动时要执行的文件,常常用来为终端自定义一些环境变量。

它在你的主目录下(/home/你的用户名)

因为 .bashrc 是以英文点号开头的文件,所以,默认文件管理器不显示。

你可以通过 Ctrl+h 切换是否显示隐藏文件。

Ctrl+Alt+T 打开终端

三、ERROR: Failed to create toolchain. 错误

这个错误过,可能就是python问题。后来能正常编译,没注意

四、安装NDK

官网下载路径

NDK 下载

NDK历史下载

0.Android-NDK的下载

方式一:

下载Android-NDK

wget -c http://dl.google.com/android/ndk/android-ndk64-r10b-linux-x86_64.tar.bz2

解压文件

sudo tar -C /解压路径 -xvf android-ndk64-r10b-linux-x86_64.tar.bz2
方式二:

下载Android-NDK

wget -c http://dl.google.com/android/ndk/android-ndk-r10b-linux-x86_64.bin

执行bin文件(即解压)

./android-ndk-r10b-linux-x86_64.bin

这里只是用r10b做演示。可以下载其他的,一般都下载r14b。 当然也可以直接在官网下载

1.Android-NDK的配置

1.1 打开bashrc文件

要想使用Android-NDK,还需要进行环境变量的配置

sudo gedit ~/.bashrc 

如果没有权限,可以使用下面的代码试试

nano ~/.bashrc
1.2 修改bashrc文件

在文件末尾添加以下内容:

NDK_PATH=/home/zxd/snowboy/swig/Android/android-ndk-r14b
export PATH=$NDK_PATH:$PATH

其中文件夹路径要精确到解压后的最高层路径

/home/zxd/snowboy/swig/Android/android-ndk-r14b 修改成自己的ndk路径

按下Ctrl + X,然后按Y保存更改,最后按Enter退出编辑器。

1.3 使bashrc文件生效

保存文件并使之生效:

source ~/.bashrc
1.4 验证ndk是否正确

安装并配置完成Android-NDK之后,需要进行安装验证,以确认正确安装并配置:

ndk-build

正常情况下

Android NDK: Could not find application project directory !    
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/home/zxd/snowboy/swig/Android/android-ndk-r14b/build/core/build-local.mk:151: *** Android NDK: Aborting    .  Stop.

配置失败的情况下

command not found`,`ndk-build命令不存在

参考

【Linux】Ubuntu下安装并配置Android-NDK(附详细过程)

五、安装python

安装

sudo apt-get install python3

查看安装位置

which python3
或
type -a python

六、安装swig

现在 swig 已经支持 apt install 命令安装了,如果不想通过下面源码安装的可以直接执行下面命令安装。

sudo apt install swig

安装完成后,通过如下代码查看版本

swig -version

显示版本号就可以了。到此结束!!!

下面的步骤是使用 swig 源码安装的方法。

下载源码

这里直接去官网下载就行了,我下载的是swig-4.0.1.tar.gz
链接:http://www.swig.org/download.html

安装g++

若已经安装可以直接跳过
若没安装则使用以下命令安装

sudo apt-get install g++
安装pcre
sudo apt-get install libpcre3 libpcre3-dev
解压swig源码
chmod 777 swig-4.0.1.tar.gz  
tar -xzvf swig-4.0.1.tar.gz  
编译、安装swig

进入刚解压出的文件夹里,指定安装目录为自定义的目录

./configure --prefix=/home/swig
make //编译
make install  //安装

若要默认安装,直接执行./configure即可

配置环境变量PATH

打开./bashrc文件并添加如下语句

export PATH=/home/swig/bin:$PATH

再使用如下命令使更改立即生效

source ~/.bashrc

安装完成!

参考

Ubuntu18.04源码编译安装swig并配置环境变量

七、编译snowboy

参考文章

snowboy github地址(不更新了):https://github.com/Kitt-AI/snowboy

snowboy不维护之后seasalt-ai又维护了一段时间(主要提供出了基于docker的唤醒词训练)所以直接下载它的源码即可

GitHub - seasalt-ai/snowboy: DNN based hotword and wake word detection toolkit (model generation included)

docker:Install Docker Desktop on Ubuntu | Docker Documentation

编译snowboy

安装swig,直接安装4.0版本,安装好之后也不需要配置环境。

sudo apt install swig

安装完成后,通过如下代码查看版本

swig -version

显示版本号就可以了。到此结束!!!

下载snowboy源码

git clone https://github.com/Kitt-AI/snowboy.git

进入到目录中

 cd swig/Androidmake

如果想要ARMv8 64bit

  make BIT=64

这将为 ARM 生成一个交叉编译库:

 jniLibs/├── arm64-v8a│   └── libsnowboy-detect-android.so└── armeabi-v7a└── libsnowboy-detect-android.so

和一些java文件

 java└── ai└── kitt└── snowboy├── SnowboyDetect.java├── snowboy.java└── snowboyJNI.java

将这些文件拷贝到源码的example-Android中,生成的apk就能运行了。

官方

训练唤醒词

训练地址

打开上面这个网址,可以训练唤醒词。

记录 3 个唤醒词示例并提交以生成 .pmdl 文件。

启用麦克风(Chrome 需要)
单击“录制”并等待准备就绪
说出唤醒词并等待结束
重复直到有 3 个示例
输入模型名称,提交音频,然后单击“保存模型”按钮

下载下来的文件是.pdml文件,这个是个人版本,不是.umdl通用版本,只适用于个人。

Models with suffix pmdl are personal models thus they are supposed to only work well for the person who provides the audio samples. If you are looking for a model that works well for everyone, you should use the universal model (with suffix umdl).

意思是说pmdl是个人适用,umdl是通用。

官方提供的umdl文件资源

bug

打开终端,执行make命令。出现以下错误

HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=4
BUILD_NUM_CPUS=8COMMAND: python ./android-ndk-r14b/build/tools/make_standalone_toolchain.py --arch arm --api 14 --stl gnustl --install-dir=/home/zxd/snowboy/swig/Android/ndk_install_32bit./android-ndk-r14b/build/tools/ndk-common.sh: line 164: python: command not found
ERROR: Failed to create toolchain.
make: [Makefile:93:/home/zxd/snowboy/swig/Android/ndk_install_32bit] 错误 1 (已忽略)
正克隆到 'OpenBLAS-Android-ARM32'...
remote: Enumerating objects: 67101, done.
remote: Counting objects: 100% (178/178), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 67101 (delta 85), reused 141 (delta 75), pack-reused 66923
接收对象中: 100% (67101/67101), 45.29 MiB | 2.64 MiB/s, 完成.
处理 delta 中: 100% (54965/54965), 完成.
正在更新文件: 100% (12011/12011), 完成.
分支 'arm_soft_fp_abi' 设置为跟踪 'origin/arm_soft_fp_abi'。
切换到一个新分支 'arm_soft_fp_abi'
HEAD 现在位于 b5c96fcfc Support ARM SOFTFP ABI for saxpy, sdot, snrm2, sscal, sgemv, sger.
make[1]: 进入目录“/home/zxd/snowboy/swig/Android/OpenBLAS-Android-ARM32”
/usr/bin/ld: warning: /tmp/cce7OVqC.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
C Compiler (/home/zxd/snowboy/swig/Android/ndk_install_32bit/bin/arm-linux-androideabi-gcc) is something wrong.
1 at ./c_check line 29.
make[1]: *** [Makefile.prebuild:37:config.h] 错误 2
Makefile.system:925: Makefile.: 没有那个文件或目录
make[1]: *** 没有规则可制作目标“Makefile.”。 停止。
make[1]: 离开目录“/home/zxd/snowboy/swig/Android/OpenBLAS-Android-ARM32”
make: [Makefile:96:OpenBLAS-Android-ARM32/install/lib/libopenblas.a] 错误 1 (已忽略)
/home/zxd/snowboy/swig/Android/ndk_install_32bit/bin/arm-linux-androideabi-g++ -O3 --sysroot=/home/zxd/snowboy/swig/Android/ndk_install_32bit/sysroot -std=c++0x -rdynamic -I../../ -Werror -Wall -fsigned-char -fpic -fPIC -mfloat-abi=softfp -march=armv7-a -mfpu=neon -DNDEBUG -ffast-math -fomit-frame-pointer -O3 -pie -fPIE -DHAVE_NEON=1 -fno-strict-aliasing -Wno-unused-function -shared -c snowboy-detect-swig.cc -o snowboy-detect-swig.o
make: /home/zxd/snowboy/swig/Android/ndk_install_32bit/bin/arm-linux-androideabi-g++: 没有那个文件或目录
make: *** [Makefile:104:snowboy-detect-swig.o] 错误 127

出现这个错误,其实是python有问题。python: command not found就是这行代码,浪费我好长时间。

解决办法

zxd@zxdvm:~$ apt-get install git 
E: 无法打开锁文件 /var/lib/dpkg/lock-frontend - open (13: 权限不够)
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),请查看您是否正以 root 用户运行?
zxd@zxdvm:~$ # apt-get install git 
zxd@zxdvm:~$ sudo  apt-get install git 
[sudo] zxd 的密码: 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
将会同时安装下列软件:git-man liberror-perl
建议安装:git-daemon-run | git-daemon-sysvinit git-doc git-email git-gui gitk gitwebgit-cvs git-mediawiki git-svn
下列【新】软件包将被安装:git git-man liberror-perl
升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 134 个软件包未被升级。
需要下载 4,673 kB 的归档。
解压缩后会消耗 23.9 MB 的额外空间。
您希望继续执行吗? [Y/n] Y
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu lunar/main amd64 liberror-perl all 0.17029-2 [25.6 kB]
获取:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu lunar-updates/main amd64 git-man all 1:2.39.2-1ubuntu1.1 [1,075 kB]
获取:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu lunar-updates/main amd64 git amd64 1:2.39.2-1ubuntu1.1 [3,572 kB]
已下载 4,673 kB,耗时 16秒 (294 kB/s)
正在选中未选择的软件包 liberror-perl。
(正在读取数据库 ... 系统当前共安装有 210746 个文件和目录。)
准备解压 .../liberror-perl_0.17029-2_all.deb  ...
正在解压 liberror-perl (0.17029-2) ...
正在选中未选择的软件包 git-man。
准备解压 .../git-man_1%3a2.39.2-1ubuntu1.1_all.deb  ...
正在解压 git-man (1:2.39.2-1ubuntu1.1) ...
正在选中未选择的软件包 git。
准备解压 .../git_1%3a2.39.2-1ubuntu1.1_amd64.deb  ...
正在解压 git (1:2.39.2-1ubuntu1.1) ...
正在设置 liberror-perl (0.17029-2) ...
正在设置 git-man (1:2.39.2-1ubuntu1.1) ...
正在设置 git (1:2.39.2-1ubuntu1.1) ...
正在处理用于 man-db (2.11.2-1) 的触发器 ...
zxd@zxdvm:~$ git -version
未知选项:-version
usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>][--exec-path[=<path>]] [--html-path] [--man-path] [--info-path][-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare][--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>][--super-prefix=<path>] [--config-env=<name>=<envvar>]<command> [<args>]
zxd@zxdvm:~$ git
用法:git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>][--exec-path[=<path>]] [--html-path] [--man-path] [--info-path][-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare][--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>][--super-prefix=<path>] [--config-env=<name>=<envvar>]<command> [<args>]这些是各种场合常见的 Git 命令:开始一个工作区(参见:git help tutorial)clone     克隆一个仓库到一个新目录init      创建一个空的 Git 仓库或重新初始化一个已存在的仓库在当前变更上工作(参见:git help everyday)add       添加文件内容至索引mv        移动或重命名一个文件、目录或符号链接restore   恢复工作区文件rm        从工作区和索引中删除文件检查历史和状态(参见:git help revisions)bisect    通过二分查找定位引入 bug 的提交diff      显示提交之间、提交和工作区之间等的差异grep      输出和模式匹配的行log       显示提交日志show      显示各种类型的对象status    显示工作区状态扩展、标记和调校您的历史记录branch    列出、创建或删除分支commit    记录变更到仓库merge     合并两个或更多开发历史rebase    在另一个分支上重新应用提交reset     重置当前 HEAD 到指定状态switch    切换分支tag       创建、列出、删除或校验一个 GPG 签名的标签对象协同(参见:git help workflows)fetch     从另外一个仓库下载对象和引用pull      获取并整合另外的仓库或一个本地分支push      更新远程引用和相关的对象命令 'git help -a' 和 'git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>' 或 'git help <概念>' 以获取给定子命令或概念的
帮助。
有关系统的概述,查看 'git help git'。
zxd@zxdvm:~$ git --version
git version 2.39.2
zxd@zxdvm:~$ git clone https://github.com/Kitt-AI/snowboy.git
正克隆到 'snowboy'...
fatal: 无法访问 'https://github.com/Kitt-AI/snowboy.git/':Recv failure: 连接被对方重设
zxd@zxdvm:~$ git config --global user.name "zxd"
zxd@zxdvm:~$ git config --global user.email "1085094472@qq.com"
zxd@zxdvm:~$ git config --list
user.name=zxd
user.email=1085094472@qq.comzxd@zxdvm:~$ git clone https://github.com/Kitt-AI/snowboy.git
正克隆到 'snowboy'...
remote: Enumerating objects: 2193, done.
remote: Counting objects: 100% (45/45), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 2193 (delta 15), reused 39 (delta 13), pack-reused 2148
接收对象中: 100% (2193/2193), 55.23 MiB | 686.00 KiB/s, 完成.
处理 delta 中: 100% (1088/1088), 完成.zxd@zxdvm:~$ cd /home/zxd/snowboy/swig/Android
zxd@zxdvm:~/snowboy/swig/Android$ make
找不到命令 “make”,但可以通过以下软件包安装它:
sudo apt install make        # version 4.3-4.1build1, or
sudo apt install make-guile  # version 4.3-4.1build1
zxd@zxdvm:~/snowboy/swig/Android$ sudo apt install make
[sudo] zxd 的密码: 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成                 
建议安装:make-doc
下列【新】软件包将被安装:make
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 134 个软件包未被升级。
需要下载 180 kB 的归档。
解压缩后会消耗 426 kB 的额外空间。
获取:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu lunar/main amd64 make amd64 4.3-4.1build1 [180 kB]
已下载 180 kB,耗时 9秒 (20.5 kB/s)           
正在选中未选择的软件包 make。
(正在读取数据库 ... 系统当前共安装有 211822 个文件和目录。)
准备解压 .../make_4.3-4.1build1_amd64.deb  ...
正在解压 make (4.3-4.1build1) ...
正在设置 make (4.3-4.1build1) ...
正在处理用于 man-db (2.11.2-1) 的触发器 ...
zxd@zxdvm:~/snowboy/swig/Android$ make
/bin/sh: 1: swig: not found
expr: 语法错误:未预期的参数 "30010"
--2023-09-19 14:47:08--  https://dl.google.com/android/repository//android-ndk-r14b-linux-x86_64.zip
正在解析主机 dl.google.com (dl.google.com)... 58.254.137.225
正在连接 dl.google.com (dl.google.com)|58.254.137.225|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 301 Moved Permanently
位置:/android/repository/android-ndk-r14b-linux-x86_64.zip [跟随至新的 URL]
--2023-09-19 14:47:10--  https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip
再次使用存在的到 dl.google.com:443 的连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 840626594 (802M) [application/zip]
正在保存至: ‘android-ndk-r14b-linux-x86_64.zip’android-ndk-r14b-li 100%[===================>] 801.68M  4.00MB/s    用时 2m 51s2023-09-19 14:50:02 (4.69 MB/s) - 已保存 ‘android-ndk-r14b-linux-x86_64.zip’ [840626594/840626594])HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=4
BUILD_NUM_CPUS=8
## COMMAND: python ./android-ndk-r14b/build/tools/make_standalone_toolchain.py --arch arm --api 14 --stl gnustl --install-dir=/home/zxd/snowboy/swig/Android/ndk_install_32bit
./android-ndk-r14b/build/tools/ndk-common.sh: line 164: python: command not found
ERROR: Failed to create toolchain.
make: [Makefile:93:/home/zxd/snowboy/swig/Android/ndk_install_32bit] 错误 1 (已忽略)
正克隆到 'OpenBLAS-Android-ARM32'...
fatal: 无法访问 'https://github.com/xianyi/OpenBLAS.git/':Recv failure: 连接被对方重设
./install_openblas.sh: 第 14 行: cd: OpenBLAS-Android-ARM32: 没有那个文件或目录
error: 路径规格 'arm_soft_fp_abi' 未匹配任何 git 已知文件
make: [Makefile:96:OpenBLAS-Android-ARM32/install/lib/libopenblas.a] 错误 1 (已忽略)
swig -I../../ -c++ -java -package ai.kitt.snowboy -outdir \java/ai/kitt/snowboy/ -o snowboy-detect-swig.cc snowboy-detect-swig.i
make: swig: 没有那个文件或目录
make: *** [Makefile:100:snowboy-detect-swig.cc] 错误 127-------------------------------------------------------出现python错误---------------------------------------------------------------------------------------------------------------------
zxd@zxdvm:~$ python3 --version
Python 3.11.4
zxd@zxdvm:~$ pip3 --version
pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)
zxd@zxdvm:~$ echo $PATH
/usr/bin/swig:/home/zxd/snowboy/swig/Android/android-ndk-r14b:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
zxd@zxdvm:~$ which python3
/usr/bin/python3
zxd@zxdvm:~$ which pip3
/usr/bin/pip3
zxd@zxdvm:~$ nano ~/.bashrc
zxd@zxdvm:~$ source ~/.bashrc
zxd@zxdvm:~$ echo $PATH
/usr/bin/python3:/usr/bin/pip3:/usr/bin/swig:/home/zxd/snowboy/swig/Android/android-ndk-r14b:/usr/bin/swig:/home/zxd/snowboy/swig/Android/android-ndk-r14b:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
zxd@zxdvm:~$ 
-------------------------------------------------------出现python错误---------------------------------------------------------------------------------------------------------------------
这里还是有问题,原因是没有软链接到pythonzxd@zxdvm:/usr/bin$ ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 10  2月 15  2023 /usr/bin/python3 -> python3.11
zxd@zxdvm:/usr/bin$ $ ln -s /usr/bin/python3.11 /usr/bin/python
$:未找到命令
zxd@zxdvm:/usr/bin$ ln -s /usr/bin/python3.11 /usr/bin/python
ln: 无法创建符号链接 '/usr/bin/python': 权限不够
zxd@zxdvm:/usr/bin$ sudo ln -s /usr/bin/python3.11 /usr/bin/python
[sudo] zxd 的密码: 
zxd@zxdvm:/usr/bin$ ---------------------------python正常了,make就可以了
参考

【语音智能管家】之语音唤醒(附演示视频)

snowboy 自定义唤醒词 实现语音唤醒【语音助手】

python:未找到命令 的解决办法(百分之九十有效) 原因:明明下载安装了python3,但是python就是不好使

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux开发工具之编辑器-vim

vim简单来说就是一款文本编辑器&#xff0c;用于写代码&#xff0c;更是一款多模式编辑器 vim的基本概念 vim有许多种模式&#xff0c;但是铁三角是以下三种模式&#xff1a;命令模式&#xff0c;插入模式&#xff0c;底行模式 1 正常/普通/命令模式&#xff08;默认打开&…

Java手写快速选择算法应用拓展案例

Java手写快速选择算法应用拓展案例 1. 引言 快速选择算法是一种高效的选择算法&#xff0c;可以用于在数组中找到第K小/大的元素。除了基本的应用场景外&#xff0c;快速选择算法还可以应用于其他问题&#xff0c;如查找中位数、查找最大/最小值等。本文将介绍两个拓展应用案…

Java学习笔记——字符/字符串

在 Java 语言中&#xff0c;字符串都被设计成「不可变」的类型&#xff0c;即无法直接修改字符串的某一位字符&#xff0c;需要新建一个字符串实现 StringBuilder 字符 字符是用单引号括起来的单个字母&#xff0c;在Java中&#xff0c;表示字符的数据类型为char。一个字符…

GNU-ncurses库简介

文章目录 前言一、安装与使用二、ncurses库基本用法2.1 initscr()2.2 refresh()2.3 endwin() 三、初始化3.1 raw(), cbreak()3.2 echo() noecho()3.3 keypad()3.4 int halfdelay(int) 四、窗口机制简介五、输出函数六、输入函数七、输出修饰八、窗口机制总结 前言 ncurses是一…

mySQL 安装

一、windows安装包下载 mysql官网提供了两种安装方式&#xff0c;一个是zip安装&#xff0c;另一个是msi安装&#xff0c;这里简绍第一种安装方式&#xff0c;第二种简单&#xff0c;不再简绍 官网下载&#xff0c;根据自己需要选择版本&#xff1a;MySQL :: MySQL Community…

ReactNative中升级IOS 17版本Crash解决

ReactNative中升级IOS 17版本Crash解决 ReactNative中升级IOS 17版本Crash解决一、问题描述二、原因分析三、解决方案决策3.1 设置宽高为非零值3.2 使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext 四、可能使用到该API的三方库4.1 react-native-fast…

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…

高云FPGA系列教程(8):ARM串口数据接收(中断和轮询方式)

文章目录 [toc]1. GW1NSR-4C串口外设简介2. FPGA配置3. 常用函数4. 轮询方式接收数据5. 中断方式接收数据 本文是高云FPGA系列教程的第8篇文章。 本篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用&#xff0c;演示轮询方式和中断方式接收串口数据&#xff0c;并进行回环…

如何搭建一个react项目(详细介绍)

要搭建一个基本的 React 项目&#xff0c;你需要执行以下步骤。在开始之前&#xff0c;请确保你已经安装了 Node.js 和 npm&#xff08;Node 包管理器&#xff09;。 搭建一个React项目 1&#xff0c;创建项目目录2&#xff0c;初始化项目3&#xff0c;安装 React 和 ReactDOM4…

安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明

此贴为基本常识。感兴趣的友友可以了解手机的启动顺序和各模式的基本操作与意义。另外了解手机系统分区各文件夹的含义 分区说明对应贴&#xff1a;安卓机型固件中分区对应说明 手机开机基本启动顺序 当我们按下手机开机键的时候。基本的启动顺序为 注意&#xff1a;该结构图…

交流耐压试验目的

试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中&#xff0c; 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化&#xff0c; 其中包括整体劣化和部分劣化&#xff0c;形成缺陷&#xff0c; 例如由于局部地方电场比较集中或者局部…

Facebook最佳聊单工具--SaleSmartly,智能回复+控评+群控分流

关于SaleSmartlySaleSmartly--全渠道客户沟通平台,它可以帮助企业实现聊天自动化、智能化&#xff0c;提高员工效率&#xff0c;降低人工成本&#xff0c;提升客服质量。 在管理facebook时&#xff0c;你遇到的痛点&#xff1a; &#xff08;1&#xff09;FB聊单如何实现业务最…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网络的异常检测(续)

目录 车载 CAN 总线网络异常检测技术 3.1 车载 CAN 总线网络异常检测技术概述 3.1.1基于统计的异

7-3 成绩等级

7-3 成绩等级 给出一个成绩&#xff0c;要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’.(90分以上为’A’,80到89分为’B’,70到79分为’C’,60到69分为’D’,60分以下为’E’。 输入格式: 在一行输入一个整数n&#xff08;n<100)。 输出格式: 在一行中输出成绩相对应的等…

大麦订单生成器最新版 大麦订单一键生成截图

1.可以一键添加&#xff0c;生成的假订单没有水印&#xff0c;界面也很真实。 2.在软件中输入生成的信息&#xff0c;这是产品信息&#xff0c;选择生成的产品图像&#xff0c;最后生成它。 后台一键生成&#xff0c;独立后台管理 教程&#xff1a;解压源码&#xff0c;修改…

用于无功补偿的固定电容晶闸管控制反应器研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

03MyBatis-Plus中的常用注解

常用注解 TableName MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, "张三", 23, "…

深入学习 Redis Sentinel - 基于 DockerCompose 编排哨兵分布式架构,理解工作原理

目录 一、哨兵模式 1.1、为何引入哨兵模式 1.2、Redis Sentinel 分布式架构 1.2.1、概述 1.2.2、工作原理&#xff08;redis 哨兵的核心功能&#xff09; 1. 监控&#xff1a; 2. 自动故障转移&#xff1a; 3. 通知 1.2.3、问题&#xff1a;哨兵结点只有一个可以么&am…

SpringCloud——微服务

微服务技术栈 在之前的开发过程中&#xff0c;我们将所有的服务都部署在一台服务器中&#xff0c;当我们的服务开始越来越多&#xff0c;业务越来越复杂&#xff0c;当一台服务器不能承担我们的业务的时候&#xff0c;就需要将不同的业务分开部署在不同的服务器上&#xff0c;…

Feign实战-Springboot集成OpenFeign Demo以及参数详解

最近整理一下微服务的文章&#xff0c;先拿一直用的OpenFeign开刀 思考&#xff1a;微服务之间如何方便优雅的实现服务间的远程调用 一、说说openFeign是什么吧&#xff1f; 说到这个&#xff0c;那不得不先说说RPC 1.什么是RPC RPC 全称是 Remote Procedure Call &#x…