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

rust工程

文章目录

  • Cargo
  • macOS配置rust环境
    • vscode配置
  • 目录结构
    • Cargo.toml
    • cargo命令
    • hello world
  • 跟web交互
    • WebAssembly
  • 跟Android交互
    • 配置Android环境
    • JNI例子
    • NDK例子

Rust 是一种现代的、系统级的编程语言,它强调并发安全、内存安全和高性能。Rust 的设计目标是提供一种有着良好抽象能力,同时又能够保证代码运行效率和安全性的语言。它将内存安全、并发安全和数据竞争检测等特性作为语言的一部分,通过所有权系统、借用检查器和生命周期等机制来防止常见的编程错误。

下面是一些与 Rust 相关的工具和库的介绍:

  1. Cargo
    Cargo 是 Rust 的包管理工具和构建系统。它能够自动管理 Rust 项目的依赖关系,并提供命令行工具来构建、测试和运行项目。Cargo 简化了 Rust 项目的创建和管理过程,使得开发者可以更专注于编写代码而不用过多关注构建细节。

  2. Clippy
    Clippy 是 Rust 的静态代码分析工具,它能够检测出一些潜在的代码问题和不良习惯,并给出相应的建议。Clippy 可以帮助开发者编写更规范、更高质量的 Rust 代码。

  3. Rust 文档(Rust Docs)
    Rust Docs 是 Rust 官方提供的文档工具,用于生成和浏览 Rust 标准库和第三方库的文档。它为 Rust 开发者提供了一个方便的方式来查阅和学习 Rust 相关的文档。

  4. Rust 标准库(Rust Standard Library)
    Rust 标准库是 Rust 语言的核心库,它提供了许多常用的数据结构、算法和系统调用等功能。开发者可以直接使用标准库中的类型和函数,以快速构建高效、安全的 Rust 程序。

  5. Rust 编译器(rustc)
    Rust 编译器是将 Rust 代码编译为可执行文件或库的工具。它负责解析、类型检查、代码生成等编译过程,并生成适应目标平台的机器码。Rust 编译器是 Rust 语言的核心组件之一,它实现了 Rust 语言规范,并负责将 Rust 代码转化为可执行的程序。

这些工具和库都是 Rust 生态系统中重要的组成部分,它们与 Rust 的设计理念和目标相辅相成,使得开发者能够更加高效地编写、测试和维护 Rust 项目。无论是初学者还是有经验的开发者,对于这些工具的了解和使用都能够提升开发效率和代码质量。

Cargo

Cargo 是 Rust 的官方构建工具和包管理器。它用于帮助开发者构建、测试和管理 Rust 项目,简化了项目的依赖管理、构建配置和发布流程。下面详细介绍一下 Cargo 的主要功能和用法:

  1. 创建项目: 使用 Cargo 可以快速创建一个新的 Rust 项目。通过运行 cargo new <project_name> 命令,在当前目录下生成一个新的项目文件夹,并自动生成了一个简单的目录结构和必要的文件,包括 Cargo.tomlsrc/main.rs 等。

  2. 依赖管理: Cargo 管理 Rust 项目的依赖关系。在项目的 Cargo.toml 文件中,可以指定项目所需要的外部依赖库及其版本。当构建项目时,Cargo 会自动下载并编译这些依赖库,并将其集成到项目中。可以使用 cargo build 命令来构建项目并处理依赖关系。

  3. 构建项目: Cargo 提供了简洁的命令行接口,可以用于构建 Rust 项目。运行 cargo build 命令将会编译项目的源代码,并生成可执行文件或库文件。Cargo 会根据项目的依赖关系自动解析和编译相关的代码。

  4. 运行项目: 使用 cargo run 命令可以方便地运行 Rust 项目。Cargo 会自动编译项目并执行生成的可执行文件。如果项目是一个库,可以使用 cargo test 命令来运行项目中的测试用例。

  5. 测试项目: Cargo 提供了内置的测试框架和命令,用于编写和运行测试用例。在项目中的 src 目录下创建一个名为 tests 的子目录,并在其中编写测试用例。然后使用 cargo test 命令运行测试,并查看测试结果。

  6. 发布项目: 使用 Cargo 可以方便地发布 Rust 项目。通过运行 cargo build --release 命令,Cargo 会进行优化编译,生成一个发布版本的可执行文件。然后可以将生成的可执行文件部署到生产环境中。

  7. 文档生成: Cargo 提供了文档生成工具,可以生成项目的文档。在项目中的注释中添加文档注解,并使用 cargo doc 命令生成文档。生成的文档会包含项目的结构、函数、模块等信息,并可以通过浏览器进行查看。

  8. 更新依赖: 当项目依赖的库有新的版本发布时,可以使用 Cargo 更新依赖关系。运行 cargo update 命令,Cargo 会检查项目的依赖关系,并下载最新的版本。

除了上述功能,Cargo 还提供了其他一些辅助功能,例如初始化 Git 仓库、自动下载编译工具链(Rustup)、发布到 Cargo 社区等。这些功能使得 Cargo 成为 Rust 开发中必不可少的工具,极大地简化了项目的管理和构建过程,提高了开发效率。

macOS配置rust环境

在 macOS 上配置 Rust 环境,可以按照以下步骤进行:

  1. 安装 Homebrew(如果未安装):
    打开终端,并执行以下命令来安装 Homebrew:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
  2. 安装 Rust 编程语言:
    在终端中执行以下命令来安装 Rust:

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    

    这将下载并运行 Rust 安装脚本。

  3. 配置环境变量:
    安装完成后,脚本会提示你将 Rust 相关的可执行文件路径添加到环境变量中。请按照提示选择「2」或输入「2」,然后按 Enter 键。

  4. 初始化 Rust 环境:
    执行以下命令初始化 Rust 环境:

    source $HOME/.cargo/env
    
  5. 验证安装:
    在终端中执行以下命令验证 Rust 是否成功安装:

    rustc --version
    cargo --version
    
  6. 安装 wasm-pack:
    这将下载并执行 wasm-pack 安装脚本。根据提示,可能需要输入管理员密码来完成安装。

    curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
    wasm-pack --version
    

如果以上步骤没有出现任何错误,那么你的 macOS 系统上已成功配置了 Rust 环境。你可以开始使用 Rust 编程语言进行开发了。需要注意的是,Rust 包管理器 Cargo 也已经安装好了,它可以帮助你管理 Rust 项目的依赖和构建过程。

希望上述步骤能够帮助到你顺利配置 Rust 环境。如果在安装过程中遇到任何问题,你可以参考 Rust 官方文档 或 Rust 社区中的相关资源来获取更多帮助。

vscode配置

当在 VS Code 中配置 Rust 开发环境时,以下是几个常用的插件推荐:

  1. rust-analyzer:这是官方提供的 Rust 插件,是一个功能强大的 Rust 语言服务器,它提供了智能代码补全、重构建议、错误检查等高级功能。

  2. Crates by serayuzgur:这个插件提供了对 Cargo.toml 和 Cargo.lock 文件的支持,可以方便地查看和管理项目的依赖关系。

  3. CodeLLDB by Vadim Chugunov:如果你需要在 VS Code 中进行 Rust 代码的调试,这个插件可以与 LLDB 调试器集成,提供了强大的调试功能。

  4. Better TOML by bungcip:这个插件提供了对 TOML 文件的语法高亮和格式化支持,对于编辑 Cargo.toml 文件来说非常实用。

  5. Rusty Code by matklad:Rusty Code 插件提供了代码格式化、自动导入缺失的模块、错误检查等功能,帮助减少开发中的一些常见错误。

以上这些插件可以为你提供更好的 Rust 开发体验,使得在 VS Code 中编写、调试和管理 Rust 项目更加便捷和高效。可以通过在 VS Code 中搜索插件名称并安装来开始配置 Rust 开发环境。同时,也可以根据自己的需求和喜好,探索其他的 Rust 插件。

目录结构

Rust 项目通常遵循一种常见的目录结构,该结构有助于组织代码、资源文件和构建工具。以下是一个常见的 Rust 项目目录结构示例:

myproject/├── src/│   └── main.rs├── Cargo.toml└── Cargo.lock

让我们逐个解释每个目录和文件的作用:

  • src/:这是存放 Rust 源代码的目录。你可以在此目录下创建多个 .rs 文件来组织你的代码。通常,你会在 src/ 目录下创建一个 main.rs 文件,其中包含项目的入口点。

  • main.rs:这是包含项目入口点(例如 main 函数)的 Rust 源代码文件。它是 Rust 程序的起点,负责启动应用程序的执行流程。

  • Cargo.toml:这是 Rust 项目的配置文件,使用 Toml 格式来描述项目的依赖项、构建选项和其他元数据。你可以在 Cargo.toml 中指定项目名称、版本号、作者信息等。

  • Cargo.lock:这是由 Cargo 自动生成的锁定文件。它记录了实际使用的依赖项及其确切版本,以确保在后续构建中使用相同的依赖项版本。

除了上述基本结构之外,Rust 项目通常还包括其他目录和文件:

  • tests/:如果你的项目包含测试代码,通常会在此目录下创建测试文件。测试代码用于验证项目中各个部分的正确性。

  • examples/:如果你想提供一些示例用法或演示代码,可以将其放置在此目录下。

  • target/:这是 Cargo 自动生成的目录,在构建过程中存储目标文件和编译生成的二进制可执行文件。

  • build.rs:这是一个可选的构建脚本文件,使用 Rust 代码编写。它允许你在构建过程中自定义一些操作,例如生成代码、配置构建选项等。

  • 其他自定义目录:根据项目的需要,你可能还会创建其他自定义的目录,用于存放静态资源文件、模板文件、配置文件等。

请注意,Rust 的目录结构没有强制要求,你可以根据项目的需求进行调整和扩展。上述目录结构只是一个常见的约定,大多数 Rust 项目都遵循类似的结构来提供一致性和易于理解的代码组织方式。

Cargo.toml

Cargo.toml 是 Rust 项目的配置文件,用于指定项目的元数据、依赖项和构建选项。它使用 Toml 格式(Tom’s Obvious, Minimal Language)编写,是一种易于理解和编辑的简单配置语言。要详细了解Cargo请阅读manifest。

下面是一个典型的 Cargo.toml 示例:

[package]
name = "myproject"
version = "0.1.0"
edition = "2021"[dependencies]
crate1 = "1.0"
crate2 = { version = "2.0", features = ["feature1", "feature2"] }[build-dependencies]
build_crate = "1.0"

让我们逐个解释每个部分的含义:

  • [package] 这个部分用于指定项目的元数据信息。

    • name:指定项目的名称。
    • version:指定项目的版本号。
    • edition:指定 Rust 的版本。支持的选项有 "2015""2018""2021"
  • [dependencies] 这个部分用于指定项目的依赖项。你可以列出项目所依赖的外部库或 crate,并指定它们的版本信息。

    • crate1 = "1.0":这表示项目依赖名为 crate1 的 crate,并指定其版本为 1.0
    • crate2 = { version = "2.0", features = ["feature1", "feature2"] }:这表示项目依赖名为 crate2 的 crate,并指定其版本为 2.0,同时启用其中的一些特性。
  • [build-dependencies] 这个部分用于指定项目构建过程中所需要的依赖项。这些依赖项只在构建过程中使用,而不会包含在最终的二进制可执行文件中。

除了上述常见的部分之外,Cargo.toml 文件还支持其他配置选项,如:

  • workspace:用于同时管理多个相关的 Rust 项目。
  • features:用于定义和启用 crate 的不同功能特性。
  • target:用于指定特定的目标平台和相关设置。
  • patch:用于修复或替换依赖项的特定版本。

你可以根据项目的需求自定义 Cargo.toml 文件,添加适当的依赖项、配置选项和元数据信息。Rust 的构建工具 Cargo 将根据 Cargo.toml 中的配置来下载和管理依赖项,并执行相应的构建操作。

希望这个介绍对你有所帮助!如果还有其他问题,请随时提问。

cargo命令

Cargo 是 Rust 的官方构建工具和包管理器,提供了许多命令用于构建、测试、管理和发布 Rust 项目。以下是 Cargo 的常用命令列表:

  1. cargo new:创建一个新的 Rust 项目。

  2. cargo build:构建项目,编译源代码并处理依赖关系。

  3. cargo run:运行项目,编译并执行生成的可执行文件。

  4. cargo test:运行测试用例。

  5. cargo bench:运行基准测试。

  6. cargo doc:生成项目文档。

  7. cargo clean:清理项目构建产生的临时文件和目录。

  8. cargo update:更新项目的依赖库。

  9. cargo init:初始化当前目录为一个 Rust 项目。

  10. cargo check:检查代码是否可以成功编译,但不生成可执行文件。

  11. cargo fix:自动修复一些编译警告和错误。

  12. cargo publish:发布项目到 crates.io,Rust 社区的包管理平台。

  13. cargo install:安装一个二进制包程序到系统路径。

  14. cargo uninstall:卸载一个已安装的二进制包程序。

  15. cargo package:生成一个用于发布的压缩包。

  16. cargo metadata:显示项目的元数据信息,依赖关系等。

  17. cargo fmt:格式化源代码。

  18. cargo clippy:运行 Clippy(Rust 的 lint 工具)对代码进行静态分析。

  19. cargo doc --open:生成文档并在浏览器中打开。

  20. cargo build --release:生成发布版本的可执行文件。

  21. cargo build --target <target>:指定目标平台进行构建。

  22. cargo build --features <features>:启用指定的特性进行构建。

  23. cargo build --no-default-features:禁用默认特性进行构建。

  24. cargo build --all:构建项目及其所有依赖。

  25. cargo build --workspace:在工作区中构建所有子项目。

  26. cargo build --lib:只构建项目中的库文件。

  27. cargo build --bin <name>:只构建指定名称的可执行文件。

  28. cargo build --example <name>:只构建指定名称的示例程序。

  29. cargo build --tests:只构建项目中的测试目标。

  30. cargo build --benches:只构建项目中的基准测试目标。

  31. cargo build --target-dir <dir>:指定构建输出的目录。

  32. cargo build --all-features:启用所有特性进行构建。

  33. cargo build --no-default-runtime:禁用默认运行时(仅适用于编写运行时的 Crate)。

  34. cargo test -- --test-threads=<num>:设置并发运行测试的线程数。

  35. cargo test -- <pattern>:只运行与指定模式匹配的测试。

  36. cargo test -- --ignored:运行被标记为 #[ignore] 的测试。

  37. cargo test --release:以发布模式运行所有测试。

  38. cargo doc --no-deps:生成项目文档,但不包含依赖库的文档。

  39. cargo run -- <args>:在编译并运行项目时传递参数。

  40. cargo check --all-targets:检查项目及其所有目标的代码是否可以成功编译。

  41. cargo fix --edition:自动升级代码到指定的 Rust 版本。

  42. cargo fix --allow-dirty:允许在 Git 工作目录中运行 cargo fix

  43. cargo publish --dry-run:发布前进行 dry-run,检查是否有错误。

  44. cargo publish --allow-dirty:允许在 Git 工作目录中运行 cargo publish

  45. cargo install <crate>:安装指定的 Crate。

  46. cargo install-update <crate>:更新指定的 Crate。

  47. cargo uninstall <crate>:卸载指定的 Crate。

  48. cargo search <query>:在 crates.io 中搜索包。

  49. cargo clean --package <spec>:清理指定的 Package。

  50. cargo metadata --format-version <version>:指定元数据格式的版本。

这些是常用的 Cargo 命令,可以帮助你管理 Rust 项目的构建、测试、文档生成、依赖管理和发布等任务。你可以通过在命令行中输入 cargo --help 来查看更多命令以及它们的详细使用说明。

hello world

要开始你的第一个 Rust “Hello, World!” 项目,按照以下步骤进行:

  1. 安装 Rust 编程语言:首先,确保您已在计算机上安装了 Rust。可以访问 Rust 官方网站,按照指示下载并安装 Rust。

  2. 创建新项目:打开终端或命令提示符,导航到要创建项目的目录,并运行以下命令来创建一个新的 Rust 项目:

    cargo new hello_world
    

    这将在当前目录下创建一个名为 “hello_world” 的新目录,并自动生成一些初始代码。

  3. 进入项目目录:运行以下命令以进入新创建的项目目录:

    cd hello_world
    
  4. 编辑代码:使用你喜欢的文本编辑器打开 src/main.rs 文件,并将以下代码复制粘贴到文件中:

    fn main() {println!("Hello, World!");
    }
    
  5. 构建和运行项目:返回终端或命令提示符,运行以下命令来构建和运行你的项目:

    cargo run
    

    Rust 的构建系统 Cargo 将编译项目并运行生成的可执行文件。你应该会在终端上看到输出 “Hello, World!”。

恭喜!你已经成功创建并运行了你的第一个 Rust “Hello, World!” 项目。从这个简单的示例开始,你可以继续学习和探索 Rust 编程语言的更多方面。

跟web交互

Rust 可以与 Web 进行交互,使你能够构建 Web 应用程序、API 和后端服务。下面是一些可以帮助你在 Rust 中进行 Web 交互的常见方法:

  1. Web 框架:使用 Rust 的 Web 框架可以简化 Web 开发过程,并提供路由、请求处理、中间件等功能。一些流行的 Rust Web 框架包括 Rocket、Actix-web 和 Warp。

  2. HTTP 客户端和服务器:Rust 提供了多个库用于构建 HTTP 客户端和服务器。例如,reqwest 是一个常用的 HTTP 客户端库,hyper 是一个强大的 HTTP 服务器库。

  3. 数据库访问:与 Web 相关的应用程序通常需要与数据库进行交互。Rust 提供了各种数据库连接库和 ORM(对象关系映射)工具,例如 Diesel、sqlx 和 rusqlite。

  4. 模板引擎:用于生成动态 HTML 页面的模板引擎在 Web 开发中非常有用。Rust 中一些流行的模板引擎包括 Tera 和 Handlebars。

  5. WebAssembly(Wasm):Rust 具备编写 WebAssembly 模块的能力,这使得你可以在 Web 浏览器中运行原生速度的 Rust 代码。你可以使用 wasm-bindgen 和 wasm-pack 工具来构建和集成 Rust 和 JavaScript 之间的接口。

  6. WebSocket:Rust 提供了用于 WebSocket 通信的库,如 tokio-tungstenite 和 actix-web 的 WebSocket 功能。

以上只是一些在 Rust 中进行 Web 交互的方法示例,你可以根据具体需求选择合适的库和工具。Rust 社区拥有丰富的资源和文档,可以帮助你深入了解和学习 Rust 的 Web 开发。

WebAssembly

以下是一个使用 Rust 和 WebAssembly(Wasm)进行交互的示例:

首先,确保你已经安装了 Rust 和 wasm-pack 工具。

  1. 创建新的 Rust 项目:
    打开终端或命令提示符,导航到要创建项目的目录,并运行以下命令来创建一个新的 Rust 项目:

    cargo new wasm_example
    cd wasm_example
    
  2. 添加依赖:
    在项目的根目录中,打开 Cargo.toml 文件,并添加以下代码来添加 wasm-bindgen 和 js-sys 的依赖:

    [lib]
    crate-type = ["cdylib"][dependencies]
    wasm-bindgen = "0.2"
    js-sys = "0.3"
    
  3. 编写 Rust 代码:
    打开 src/lib.rs 文件,并使用以下代码替换其中的内容:

    use wasm_bindgen::prelude::*;#[wasm_bindgen]
    extern "C" {#[wasm_bindgen(js_namespace = console)]fn log(s: &str);
    }#[wasm_bindgen]
    pub fn greet(name: &str) {let message = format!("FromRust, {}!", name);log(&message);
    }
    

    上述代码定义了一个 greet 函数,它接受一个字符串参数,并在控制台输出问候消息。

  4. 生成 Wasm 模块:
    在终端中运行以下命令来生成 Wasm 模块:

    wasm-pack build --target web
    

    这将使用 wasm-pack 工具将 Rust 代码编译为 WebAssembly 模块,并生成与 JavaScript 交互的必要代码。

  5. 创建 HTML 文件:
    在项目的根目录中,创建一个名为 index.html 的文件,并使用以下代码填充它:

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>WebAssembly Example</title><script type="module">import init, { greet } from './pkg/wasm_example.js';async function run() {await init();greet("Alice");}run();</script>
    </head>
    <body>
    </body>
    </html>
    

    上述代码导入了生成的 wasm_example.js 文件,并在页面加载完成后调用 greet 函数。

  6. 启动本地服务器:
    在终端中运行以下命令来启动一个简单的本地服务器:

    python -m http.server
    
  7. 运行示例:
    打开浏览器并访问 http://localhost:8000,然后打开浏览器的控制台。你应该会看到控制台输出了 “Hello, Alice!”。

通过上述步骤,你可以在 Rust 中创建一个简单的 WebAssembly 模块,并与 JavaScript 进行交互。你可以根据需要扩展这个示例,并使用更多的 Rust 函数与 JavaScript 进行交互。

跟Android交互

当你想要在 Android 平台上使用 Rust 与 Java 进行交互时,下面是一些具体的步骤和工具可以帮助你实现这一目标:

  1. 使用 JNI(Java Native Interface):JNI 提供了一种方式,使得 Java 和本地代码能够进行交互。你可以使用 Rust 编写本地代码,并通过 JNI 接口与 Android 的 Java 代码进行通信。为了在 Rust 中与 JNI 交互,你可以使用 jnirust-jni 等库来编写相应的绑定代码。

    需要完成的步骤:

    • 编写 Rust 的绑定代码,将 Rust 函数暴露给 JNI。
    • 生成动态链接库(.so 文件)。
    • 在 Android 项目中使用 JNI 接口调用 Rust 函数。
  2. 使用 NDK(Native Development Kit):NDK 允许你使用 C、C++ 或其他本地语言来开发 Android 应用程序。你可以使用 Rust 作为 C 或 C++ 的替代语言,并在 NDK 中构建包含 Rust 代码的本地库。然后,你可以使用 Java 代码通过 JNI 调用这些本地库。

    需要完成的步骤:

    • 创建 Android NDK 项目,并配置好 Rust 的构建环境。
    • 编写 Rust 代码并构建共享库(.so 文件)。
    • 使用 JNI 接口在 Java 代码中调用本地库中的函数。
  3. 使用 FFI(Foreign Function Interface):FFI 允许不同语言之间进行函数调用和数据传递。你可以使用 Rust 的 FFI 功能,将 Rust 函数暴露给其他语言,比如 Java。通过这种方式,你可以在 Android 的 Java 代码中直接调用 Rust 函数。

    需要完成的步骤:

    • 使用 Rust 的 #[no_mangle]extern 关键字将函数标记为可供外部调用。
    • 根据 FFI 规范编写 Java 代码来调用 Rust 函数。
    • 在 Android 项目中将 Rust 代码和 Java 代码一起编译和构建。
  4. 使用 rust-android-gradle 插件:rust-android-gradle 是一个方便的工具,可用于将 Rust 代码集成到 Android 项目中。它可以自动处理 Rust 代码的构建和链接,并与 Gradle 构建系统集成。

    需要完成的步骤:

    • 在 Android 项目的 Gradle 文件中添加 rust-android-gradle 插件的依赖。
    • 创建 Rust 模块并设置构建配置。
    • 在 Android 项目中使用预生成的 Rust 库。

请注意,在实施任何方法之前,你需要确保已经按照相应工具和库的文档进行了正确的配置和设置。每种方法都有其优势和适用场景,因此根据需求选择最适合你的方法。

希望这些详细的步骤能够帮助你更好地理解 Rust 与 Android 的交互,并实现你的项目需求。

配置Android环境

要正确安装和配置 Android NDK,请按照以下步骤进行操作:

  1. 下载 Android NDK:访问 Android NDK 的官方网站下载适合你操作系统的最新版本。

  2. 解压缩文件:将下载的 NDK 压缩文件解压到你选择的位置。例如,你可以将其解压到 ~/android-ndk 目录下。

  3. 配置环境变量:打开终端并编辑你的 shell 配置文件(例如 ~/.bashrc~/.zshrc)。在文件末尾添加以下行(假设你将 NDK 解压缩到了 ~/android-ndk 目录):

    export ANDROID_NDK_HOME=~/android-ndk
    export PATH=$PATH:$ANDROID_NDK_HOME
    

    保存文件后执行以下命令使配置立即生效:

    source ~/.bashrc
    

    或者你也可以重新启动终端。

  4. 测试安装:在终端中运行以下命令验证是否正确安装和配置了 Android NDK:

    ndk-build --version
    

    如果成功安装并配置,将显示 NDK 版本信息。

  5. 安装交叉编译目标:运行以下命令来安装 aarch64-linux-android 目标:

    rustup target add aarch64-linux-android
    rustup target add arm-linux-androideabi
    rustup target add armv7-linux-androideabi
    rustup target add i686-linux-android
    rustup target add thumbv7neon-linux-androideabi
    rustup target add x86_64-linux-android
    
  6. 配置链接器和编译参数:创建一个名为 $HOME/.cargo 的文件夹,并在其中创建一个名为 config 的文件。在 config 文件中添加以下内容:

    [target.arm-linux-androideabi]
    ar = "llvm-ar"
    linker = "armv7a-linux-androideabi29-clang"[target.armv7-linux-androideabi]
    ar = "llvm-ar"
    linker = "armv7a-linux-androideabi29-clang"[target.thumbv7neon-linux-androideabi]
    ar = "llvm-ar"
    linker = "armv7a-linux-androideabi29-clang"[target.aarch64-linux-android]
    ar = "llvm-ar"
    linker = "aarch64-linux-android29-clang"[target.i686-linux-android]
    ar = "llvm-ar"
    linker = "i686-linux-android29-clang"[target.x86_64-linux-android]
    ar = "llvm-ar"
    linker = "x86_64-linux-android29-clang"
    
  7. 测试编译:现在,你可以尝试使用 Cargo 构建你的项目,并将目标设置为 Android 平台,例如:

    cargo build --target aarch64-linux-android
    

通过按照以上步骤配置 Rust 的交叉编译环境,你应该能够开始在 Android 平台上使用 Rust 进行交叉编译了。

JNI例子

当使用 JNI 实现 Rust 与 Android 的交互时,可以使用以下示例来说明具体步骤。假设你希望在 Android 应用程序中调用一个计算两个整数和的 Rust 函数。

  1. 创建一个名为 rust_lib 的 Rust 项目cargo new rust_lib --lib,并添加以下内容到 lib.rs 文件中:

    #[no_mangle]
    pub extern "C" fn rust_greet(name: *const c_char) -> *mut c_char {let c_str = unsafe {assert!(!name.is_null());CStr::from_ptr(name)};let name = c_str.to_str().unwrap();let greeting = format!("FromRust, {}!", name);CString::new(greeting).unwrap().into_raw()
    }
    
  2. Cargo.toml 文件中添加以下内容:

    [lib]
    crate-type = ["cdylib"]
    
  3. 使用以下命令在 Rust 中构建共享库文件:

    cargo build --target aarch64-linux-android
    

    上述命令将在 target/aarch64-linux-android/debug/librust_lib.so 中生成共享库文件。

  4. 在 Android 项目中的 app 模块下的 src/main 目录中创建一个名为 jni 的文件夹,并在其中创建一个 native-lib.cpp 文件。

  5. native-lib.cpp 文件中添加以下内容:

    #include <jni.h>
    #include <string>
    #include <dlfcn.h>extern "C" JNIEXPORT jstring JNICALL
    Java_com_example_androidapp_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */,jstring name) {const char* nativeString = env->GetStringUTFChars(name, nullptr);void* handle = dlopen("librust_lib.so", RTLD_LAZY);if (!handle) {return env->NewStringUTF("Failed to load Rust library");}typedef char* (*rust_greet_func)(const char*);rust_greet_func greet = (rust_greet_func)dlsym(handle, "rust_greet");if (!greet) {return env->NewStringUTF("Failed to find Rust function");}char* result = greet(nativeString);env->ReleaseStringUTFChars(name, nativeString);jstring output = env->NewStringUTF(result);free(result);dlclose(handle);return output;
    }
    

    要把librust_lib.so复制到jniLibs对应的目录中。

  6. 配置cmake

    app build.gradle

    android {// ...defaultConfig {// ...externalNativeBuild {cmake {cppFlags '-std=c++17'}}ndk {abiFilters "arm64-v8a"}}sourceSets {main {// 配置 jniLibs 文件目录jniLibs.srcDirs = ['libs']}}externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'}}
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.22.1)
    project("rust_jni")
    add_library(${CMAKE_PROJECT_NAME} SHARED native-lib.cpp)
    target_link_libraries(${CMAKE_PROJECT_NAME} android log)
    
  7. 在 Android 项目的 Java 类中,添加以下方法:

    public class MainActivity extends AppCompatActivity {static {System.loadLibrary("native-lib");}public native String stringFromJNI(String name);// ...
    }
    
  8. MainActivity.java 中的任何适当的方法中调用 stringFromJNI() 方法,并向其传递一个字符串参数:

    String greeting = stringFromJNI("Stone " + new Date().toString());
    Log.d("MainActivity", greeting);
    

这样,在 Android 应用程序中运行时,将调用 Rust 函数并输出日志中的问候语。

NDK例子

当使用 Rust 和 Android NDK 进行开发时,以下是一个详细的示例,展示如何在 Android 项目中使用 Rust 编写并调用函数。

  1. 创建 Rust 项目:

    在终端中执行以下命令,创建一个名为 rust-ndk 的 Rust 项目:

    cargo new rust-ndk
    

    进入项目目录:

    cd rust-ndk
    
  2. 添加依赖项:

    打开项目中的 Cargo.toml 文件,并添加 ndkjnilibc 作为依赖项:

    [lib]
    crate-type = ["cdylib"]
    path = "src/jni.rs"[dependencies]
    jni = "0.21.1"
    
  3. 创建 JNI 接口:

    在项目的根目录下创建一个名为 jni.rs 的文件,并添加以下代码:

    use jni::JNIEnv;
    use jni::objects::{JClass, JString};
    use jni::sys::jstring;#[no_mangle]
    pub unsafe extern "C" fn Java_com_example_rustndk_MainActivity_stringFromRust<'local>(mut env: JNIEnv<'local>,_: JClass<'local>,input: JString<'local>)-> jstring {let input: String = env.get_string(&input).expect("Couldn't get java string!").into();let output = env.new_string(format!("FromRust, {}!", input)).expect("Couldn't create java string!");output.into_raw()
    }
    

    这个例子中的 Java_com_example_rustndk_MainActivity_stringFromRust 函数是一个 JNI 方法,在字符串前面拼接一个FromRust字符串。

  4. 构建 Rust 项目:

    在终端中执行以下命令构建 Rust 项目:

    cargo build --target aarch64-linux-android --release
    
  5. 创建 Android 项目:

    使用 Android Studio 创建一个新的 Android 项目,并导航到 app/src/main 目录。

  6. 添加 Rust 动态链接库:

    将生成的 .so 文件复制到 app/src/main/jniLibs 目录下(如果没有该目录则自行创建)。例如,将 ../rust-ndk/target/release/librust_ndk.so 文件复制到 app/src/main/jniLibs/arm64-v8a/ 目录下。

  7. 创建 Java 类和 JNI 接口:

    app/src/main/java/com/example/rustndk 目录下创建一个名为 MainActivity.java 的类,并添加以下代码:

    package com.example.rustndk;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("rust_ndk");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromRust("Stone " + new Date().toString()));}public native String stringFromRust(String str);
    }
    

    这个类包含了一个静态代码块,用于加载名为 rust_ndk 的动态链接库。还有一个名为 stringFromRust 的方法,用于调用 Rust 函数。

这样,在 Android 应用程序中运行时,将调用 Rust 函数并输出日志中的问候语。

相关文章:

rust工程

文章目录 CargomacOS配置rust环境vscode配置 目录结构Cargo.tomlcargo命令hello world 跟web交互WebAssembly 跟Android交互配置Android环境JNI例子NDK例子 Rust 是一种现代的、系统级的编程语言&#xff0c;它强调并发安全、内存安全和高性能。Rust 的设计目标是提供一种有着良…...

Java并发工具类

JDK并发包中常用并发工具类&#xff1a; CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段&#xff1b; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…...

晨控CK-GW208与三菱L系列PLC以TCP通讯手册

晨控CK-GW208是一款支持标准工业以太网协议的IO-LINK主站网关&#xff0c;方便用户快速便捷的集成到 PLC 等控制系统中。 CK-GW208主站网关集成 8 路 IO-LINK 通信端口&#xff0c;采用即插即用模式&#xff0c;无需繁琐的配置&#xff0c;减轻现场安装调试的工作量。为了满足…...

c++11 标准模板(STL)(std::basic_istringstream)(五)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…...

【案例教程】高分论文密码:大尺度空间模拟预测与数字制图

尺度空间模拟预测和数字制图技术和不确定性分析广泛应用于高分SCI论文之中&#xff0c;号称高分论文密码。大尺度模拟技术可以从不同时空尺度阐明农业生态环境领域的内在机理和时空变化规律&#xff0c;又可以为复杂的机理过程模型大尺度模拟提供技术基础。在本次培训中&#x…...

uniapp 自定义手机顶部状态栏(适配状态栏高度)

开启页面自定义导航栏功能 uniapp 在 pages.json 页面设置了全局的 globalStyle 的 "navigationStyle": "custom" 或单页面的 style 的 "navigationStyle": "custom" 之后页面顶部就没有自带的导航栏了&#xff0c;这时用户可自定义该…...

【LeetCode】1448.统计二叉树中好节点的数目

题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 …...

C语言基础之——数组

前言&#xff1a;本篇文章&#xff0c;我们将对一维数组&#xff0c;和二维数组进行展开式的讲解&#xff0c;并进行实际应用。 目录 一.一维数组 1.一维数组的创建和初始化 &#xff08;1&#xff09;数组的创建 &#xff08;2&#xff09;数组的初始化 2.一维数组的使用…...

c# 插入排序

插入排序&#xff08;Insertion Sort&#xff09;&#xff1a;将未排序的元素逐个插入到已排序的序列中的正确位置。 原始数据&#xff1a;{4&#xff0c;3&#xff0c;2&#xff0c;90&#xff0c;10} 第一个循环j0 首先取出索引为1的元素 3 &#xff0c;索引为0的元素4&…...

action和mutation之间的利用 代码解释

场景&#xff1a;购物车点击按钮 context.commit(‘changeCount’, { goodsNum, goodsId })解释这段代码 这段代码是在使用 Vuex 进行状态管理时常见的一种写法。下面对代码进行解释&#xff1a; context.commit 是 Vuex 中的一个方法&#xff0c;用于触发一个名为 changeC…...

WPF基础入门-Class4-WPF绑定

WPF基础入门 Class4&#xff1a;WPF绑定 1、cs文件中设置需要绑定的数据&#xff1a; public partial class Class_4 : Window{public Class_4(){InitializeComponent();List<Color> test new List<Color>();test.Add(new Color() { Code "Yellow",…...

【广州华锐互动】VR高校虚拟实验教学平台提供丰富的资源支持,提高教学效果

随着科技的不断进步&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;其中包括教育。 广州华锐互动利用VR虚拟现实技术打造的VR高校虚拟实验教学平台&#xff0c;是一种新型的教学工具&#xff0c;它提供了一个在线的教学资源管理平台&#xff0c;包含教学平台、…...

pytorch学习(7)——神经网络优化器torch.optim

1 optim 优化器 PyTorch神经网络优化器&#xff08;optimizer&#xff09;通过调整神经网络的参数&#xff08;weight和bias&#xff09;来最小化损失函数&#xff08;Loss&#xff09;。 学习链接&#xff1a; https://pytorch.org/docs/stable/optim.html 1.1 优化器基类 使…...

leetcode做题笔记​101. 对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 思路一&#xff1a;递归 bool isSymmetric(struct TreeNode* root){if (root NULL) return true;return fun(root->left, root->right); }int fun(struct TreeNode* l_root, struct TreeNode* r_root) {…...

边缘计算相关概念--学习笔记

一.边缘计算概念 边缘计算将数据的处理&#xff0c;应用程序的运行甚至一些功能服务的实现&#xff0c;由网络中心下放到网络边缘的节点上&#xff0c;在网络边缘侧的智能网关上就近采集并且处理数据&#xff0c;不需要将大量未处理的数据上传到远程的大数据平台。边缘计算理论…...

flutter windows编译错误 flutter_assemble.vcxproj

flutter 编译windows是出现错误。 [ 44 ms] d:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(248,5): error MSB8066: &#xfffd;&#xfffd;E:\work\kkview_kuaichuan\kkview_kuaichuan\build\windows\C…...

通过运行中的容器生成 Docker Compose 配置文件

背景 笔者之前有一次不小心删除了原始的 docker-compose.yml 文件&#xff0c;不过正在运行的 Docker 容器还在&#xff0c;找了许久&#xff0c;发现一个方法可以从这些容器中生成一个等效的 Docker Compose 配置文件。本文将介绍使用 autocompose 工具从正在运行的容器中反向…...

rancher界面无法登陆问题解决,登录超时;

1.找到rancher主机&#xff0c;查看日志 docker ps | grep rancher # rancher 容器 名称 jolly_ptolemy docker logs -f jolly_ptolemy 日志提示&#xff0c; java.sql.SQLException: Got error 28 from storage engine&#xff0c;磁盘满了 2.磁盘管理 df -h #查看磁盘使…...

Django(6)-django项目自动化测试

Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有以 tests 开头的文件里寻找并执行测试代码。 我们的 polls 应用现在有一个小 bug 需要被修复&#xff1a;我们的要求是如果 Question 是在一天之内发布的&#xff0c; Question.was_published_recentl…...

【AUTOSAR】【CAN通信】CanNm

目录 一、概述 二、说明 三、功能说明 3.1 协调算法 3.2 操作模式 3.2.1 网络模式...

拼多多淘宝大量缓存商品数据用什么格式提供比较好?

众所周知&#xff0c;淘宝拼多多是我国主流的电商平台&#xff0c;其上有大量的商品数据。很多商家会通过API来访问他们的商品数据&#xff0c;根据API的调用次数收费。第三方数据公司提供电商数据接口API&#xff0c;采集实时数据。但是&#xff0c;在他们的服务器上有大量的缓…...

【校招VIP】前端校招考点之页面转换算法

考点介绍&#xff1a; 在地址映射过程中&#xff0c;若在页面中发现所要访问的页面不在内存中&#xff0c;则产生缺页中断。当发生缺页中断时&#xff0c;如果操作系统内存中没有空闲页面&#xff0c;则操作系统必须在内存选择一个页面将其移出内存&#xff0c;以便为即将调入的…...

android 下载网络文件

工具类 import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.os.Environment; import android.util.Log;import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import …...

springboot定时任务:同时使用定时任务和websocket报错

背景 项目使用了websocket,实现了消息的实时推送。后来项目需要一个定时任务&#xff0c;使用org.springframework.scheduling.annotation的EnableScheduling注解来实现&#xff0c;启动项目之后报错 Bean com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration of t…...

CSS3渐变及2D转换

CSS3渐变及2D转换 持续更新哦… 1、css3渐变 概念: CSS3渐变(gradient)可以让你在两个或多个指定的颜色之间显示平 稳的过渡。以前&#xff0c;你必须使用图像来实现这些效果&#xff0c;现在通过使用 CSS3的渐变(gradients)即可实现。此外&#xff0c;渐变效果的元素在放大…...

无涯教程-PHP - eregi()函数

eregi() - 语法 int eregi(string pattern, string string, [array regs]); eregi()函数在pattern指定的整个字符串中搜索string指定的字符串,。搜索不区分大小写。 Eregi()在检查字符串的有效性时特别有用。 可选的输入参数regs包含一个由正则表达式中的括号分组的所有匹配…...

Spring与Mybatis整合aop整合pageHelper分页插件

前言 Spring与MyBatis整合的意义在于提供了一种结合优势的方式&#xff0c;以便更好地开发和管理持久层&#xff08;数据库访问&#xff09;代码。 这里也是总结了几点主要意义 简化配置&#xff1a;Spring与MyBatis整合后&#xff0c;可以通过Spring的配置文件来管理和配置M…...

SSL/CA 证书及其相关证书文件(pem、crt、cer、key、csr)

数字证书是网络世界中的身份证&#xff0c;数字证书为实现双方安全通信提供了电子认证。数字证书中含有密钥对所有者的识别信息&#xff0c;通过验证识别信息的真伪实现对证书持有者身份的认证。数字证书可以在网络世界中为互不见面的用户建立安全可靠的信任关系&#xff0c;这…...

【JavaSE】内部类

文章目录 内部类概念局部内部类匿名内部类&#xff08;重点重点&#xff01;&#xff01;&#xff01; &#xff09;成员内部类静态内部类 内部类概念 可以将一个类定义在另一个类或者一个方法的内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类。内部类也是封装的一…...

Django(2)-编写你的第一个 Django 应用

本教程的目的是创建一个网络投票应用程序。 它将由两部分组成&#xff1a; 一个让人们查看和投票的公共站点。 一个让你能添加、修改和删除投票的管理站点。 创建应用 $ python manage.py startapp polls每一个应用是一个python包&#xff0c;一个项目可以包含多个应用。 …...

燃气管网监测系统,24小时守护燃气安全

随着社会的发展和人民生活水平的提高&#xff0c;燃气逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;近年来&#xff0c;屡屡发生的燃气爆炸问题&#xff0c;也让人们不禁对燃气的安全性产生了担忧。因此&#xff0c;建立一个高效、实时、准确的燃气管网监测…...

昌硕科技、世硕电子同步上线法大大电子合同

近日&#xff0c;世界500强企业和硕联合旗下上海昌硕科技有限公司&#xff08;以下简称“昌硕科技”&#xff09;、世硕电子&#xff08;昆山&#xff09;有限公司&#xff08;以下简称“世硕电子”&#xff09;的电子签项目正式上线。上线仪式在上海浦东和硕集团科研大楼举行&…...

es的索引管理

概念 &#xff08;1&#xff09;集群&#xff08;Cluster&#xff09;&#xff1a; ES可以作为一个独立的单个搜索服务器。不过&#xff0c;为了处理大型数据集&#xff0c;实现容错和高可用性&#xff0c;ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。 &…...

Rust 的四大类型的宏 (元编程)

文章目录 概念函数宏或声明宏&#xff08;Function Macro&#xff09;过程宏&#xff08;Procedural Macro&#xff09;类函数的过程宏&#xff08;Function-like-procedural-macros&#xff09;派生宏&#xff08;Derive Macro&#xff09;派生宏附加其他属性 属性宏&#xff…...

探索数据湖中的巨兽:Apache Hive分布式SQL计算平台浅度剖析!

文章目录 ◆ Apache Hive 概述1.1 分布式SQL计算1.2 Hive的优势 ◆ 模拟实现Hive功能2.1 元数据管理2.2 解析器2.3 基础架构2.4 Hive架构 ◆ Hive基础架构3.1 Hive架构图3.2 Hive组件3.2.1 元数据存储3.2.2 Driver驱动程序3.2.3 用户接口 ◆ Hive部署4.1 VMware虚拟机部署步骤一…...

Node.js 的 Buffer 是什么?一站式了解指南

在 Node.js 中&#xff0c;Buffer 是一种用于处理二进制数据的机制。它允许你在不经过 JavaScript 垃圾回收机制的情况下直接操作原始内存&#xff0c;从而更高效地处理数据&#xff0c;特别是在处理网络流、文件系统操作和其他与 I/O 相关的任务时。Buffer 是一个全局对象&…...

延时盲注技术:SQL 注入漏洞检测入门指南

部分数据来源:ChatGPT 引言 在网络安全领域中,SQL 注入漏洞一直是常见的安全隐患之一。它可以利用应用程序对用户输入的不恰当处理,导致攻击者能够执行恶意的 SQL 查询语句,进而获取、修改或删除数据库中的数据。为了帮助初学者更好地理解和检测 SQL 注入漏洞,本文将介绍…...

【Midjourney电商与平面设计实战】创作效率提升300%

不得不说&#xff0c;最近智能AI的话题火爆圈内外啦。这不&#xff0c;战火已经从IT行业燃烧到设计行业里了。 刚研究完ChatGPT&#xff0c;现在又出来一个AI作图Midjourney。 其视觉效果令不少网友感叹&#xff1a;“AI已经不逊于人类画师了!” 现如今&#xff0c;在AIGC 热…...

URI、URL、URIBuilder、UriBuilder、UriComponentsBuilder说明及基本使用

之前想过直接获取url通过拼接字符串的方式实现,但是这种只是暂时的,后续地址如果有变化或参数很多,去岂不是要拼接很长,由于这些等等原因,所以找了一些方法实现 java.net.URI URI全称是Uniform Resource Identifier,也就是统一资源标识符,它是一种采用特定的语法标识一…...

抓包 - 简要总结 - Windows和Android抓包

抓包 - 简要总结 - Windows和Android抓包 前言 小巧且强大的抓包工具“Fiddler”安装可参考我的另一篇博客&#xff1a;抓包 - 经典抓包工具Fiddler的安装与初使用 本文主要介绍如何使用Fiddler抓包Windows和安卓。 Windows 抓包Windows很简单&#xff0c;安装证书&#x…...

iOS脱壳技术(二):深入探讨dumpdecrypted工具的高级使用方法

前言 应用程序脱壳是指从iOS应用程序中提取其未加密的二进制可执行文件&#xff0c;通常是Mach-O格式。这可以帮助我们深入研究应用程序的底层代码、算法、逻辑以及数据结构。这在逆向工程、性能优化、安全性分析等方面都有着重要的应用。 在上一篇内容中我们已经介绍了Clutc…...

4.RabbitMQ高级特性 幂等 可靠消息 等等

一、如何保证生产者生产消息100%的投递成功 保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点&#xff08;Broker&#xff09;确认应答完善的消息进行补偿机制 1. 理解Confirm确认消息机制 消息的确认&#xff0c;是指生产者投递消息后&#xff0c;如果Broker收到消…...

ES常见错误总结

目录 报错信息 复盘 org.elasticsearch.index.query.QueryShardException:No mapping found for [xx] in order to sort on 报错信息 测试环境 org.elasticsearch.index.query.QueryShardException: No mapping found for [xx] in order to sort on 数据不存在的时候或者…...

35、下载、安装 jdk11 记录,Idea中把项目从 jdk8 换 jdk 11

之前一直用jdk8&#xff0c;现在改成 11的试试看 登录官网下载这个11 https://www.oracle.com/cn/java/technologies/downloads/#java11-windows 下载jdk的oracle官网 需要自己注册oracle账户 修改环境变量的 JAVA_HOME Path 路径这里原本添加8的时候有了&#xff0c;不…...

TinyVue - 华为云 OpenTiny 出品的企业级前端 UI 组件库,免费开源,同时支持 Vue2 / Vue3,自带 TinyPro 中后台管理系统

华为最新发布的前端 UI 组件库&#xff0c;支持 PC 和移动端&#xff0c;自带了 admin 后台系统&#xff0c;完成度很高&#xff0c;web 项目开发又多一个选择。 关于 OpenTiny 和 TinyVue 在上个月结束的华为开发者大会2023上&#xff0c;官方正式进行发布了 OpenTiny&#…...

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…...

脚本:PDF文件批量转换成图片(python3)

文章目录 语言用法源码1源码2 语言 语言&#xff1a;python 3 用法 用法&#xff1a;选择PDF文件所在的目录&#xff0c;点击 确定 后&#xff0c;自动将该目录下的所有PDF转换成单个图片&#xff0c;图片名称为: pdf文件名.page_序号.jpg 如运行中报错&#xff0c;需要自行…...

Spring和mybatis整合

一、Spring整合MyBatis 1. 导入pom依赖 1.1 添加spring相关依赖(5.0.2.RELEASE) spring-core spring-beans spring-context spring-orm spring-tx spring-aspects spring-web 1.2 添加mybatis相关依赖 mybatis核心&#xff1a;mybatis(3.4.5) Mybatis分页&#xff1a;pagehel…...

应知道的python基础知识

1、运算符 2、特殊情况下的逻辑运算 3、循环中的else 3.1 while else 3.2 for else 4、列表相关操作 列表的相关操作 4.1增(append, extend, insert) 通过append可以向列表添加元素:列表.append(新元素数据)通过extend可以将另一个列表中的元素逐一添加到列表中:列表.exte…...

FFmpeg<第一篇>:环境配置

1、官网地址 http://ffmpeg.org/download.html2、linux下载ffmpeg 下载&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2解压&#xff1a; tar xvf ffmpeg-snapshot.tar.bz23、FFmpeg ./configure编译参数汇总 解压 ffmpeg-snapshot.tar.bz2 之后&…...