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

Android之JNI详解

Android之JNI详解

  • 简介
  • 创建项目
  • 注册
    • 动态注册
    • 静态注册
  • 关键词解读
  • 基础数据类型
  • 引用java对象
  • JNI引用与释放
  • cmake配置文件

简介

JNI(Java Native Interface) 是 Java 提供的一种编程框架,用于在 Java 应用程序中调用和与用其他编程语言(如 C、C++ 等)编写的本地代码(Native Code)进行交互。它允许 Java 程序访问操作系统或硬件提供的底层功能。

创建项目

  1. 在AS中选择Native C++创建项目
    在这里插入图片描述
  2. 项目结构
  • native.cpp:实现本地代码(Native Code)的C++源文件。
  • CmakeList.txt:是 CMake 工具使用的配置文件,用于指定如何构建一个 C/C++ 项目。CMake 是一个跨平台的构建系统生成器,它可以根据 CMakeLists.txt 文件生成适合特定平台和编译器的构建文件。
    在这里插入图片描述

注册

动态注册

  1. 简介:与静态注册不同,动态注册通过调用 JNI 提供的RegisterNatives函数,在程序运行时显式地注册本地方法。
  2. 实现步骤
    重要点:构建JNINativeMethod结构体:
typedef struct {const char* name; // java类对应的方法名const char* signature;	//函数签名void*       fnPtr;	//cpp方法的指针函数
} JNINativeMethod;
  • 步骤一:
package com.hzh.jnidemo;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("jnidemo");}public native String stringFromJNI();public native String jniTest();
}
  • 步骤二:
//cpp交互方法,这里是属于native的命名
jstring native_stringFromJNI(JNIEnv *env,jobject thiz){return env->NewStringUTF("动态注册成功!");
}
jstring native_jniTest(JNIEnv *env, jobject thisz) {std::string str = "动态注册成功!";return env->NewStringUTF(str.c_str());
}// 需要动态注册native方法的类名
static const char *mClassName = "com/hzh/jnidemo/MainActivity";// 动态注册函数结构数组
static const JNINativeMethod methods[] = {{"jniTest",	//对应java交互类的方法名"()Ljava/lang/String;", //对应方法名的函数签名(jstring *) native_jniTest //对应cpp交互的指针函数},{"stringFromJNI","()Ljava/lang/String;",(void *) native_stringFromJNI}
};JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv* env = NULL;// 1. 获取 JNIEnv,这个地方要注意第一个参数是个二级指针int result = vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6);// 2. 是否获取成功if(result != JNI_OK){return JNI_VERSION_1_6;}// 3. 注册方法,通过FindClass寻找jclass classMainActivity = env->FindClass(mClassName);//RegisterNatives 函数接受三个参数://jclass clazz:Java 类的引用。//const JNINativeMethod* methods:指向 JNINativeMethod 结构体数组的指针,描述 Java 方法与本地方法的映射关系。//jint nMethods:映射关系的数量。result = env->RegisterNatives(classMainActivity,methods, 2);if(result != JNI_OK){return JNI_VERSION_1_2;}return JNI_VERSION_1_6;
}

JNI_OnLoad是在初始化的时候调用,参考activity的生命周期,通过FindClass找到对应的class,最后通过RegisterNatives来实现动态注册。需要留意的是JNINativeMethod结构体以及RegisterNatives的参数。

静态注册

  1. 简介:通过 JNI 规范中约定的命名规则,将 Java 方法与本地(Native)方法的实现直接映射。这种映射关系在编译时由编译器根据方法名和签名自动生成。
  2. Native命名规则:遵循Java_包名_类名_方法名的格式,包咯面的"."需要转换成“_”,例如Java 类 com.hzh.jnidemo中的方法 MainActivity,对应的 C/C++ 函数名应为com_hzh_jnidemo_MainActivity。
  3. 原理:Java 编译器会根据 native 方法的声明生成方法签名,而 C/C++ 编译器会根据命名规则生成符号表。JVM 在加载类时,通过方法签名匹配符号表中的函数名,完成绑定。
  4. 实现步骤
  • Java端的实现如下:
    通过System.loadLibrary(“*****”)进行加载交互。
package com.hzh.jnidemo;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("jnidemo");}...public native String stringFromJNI();
}
  • Native端的实现:
#include <jni.h>
#include <string>extern "C" JNIEXPORT jstring JNICALL
//*遵循命名规则实现方法*
Java_com_hzh_jnidemo_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}

关键词解读

  • extern “C”:在 c++ 中可以使用使用 c 代码
  • JNIEXPORT:是一个宏,用于导出本地方法。
  • JNICALL:是一个宏,用于指定调用约定(Calling Convention),通常是个空的宏定义。
  • JNIEnv:是一个指向JNI函数的指针结构体。
    作用:调用JNI函数,如创建Java对象、访问Java字段、调用Java方法等。
    示例:
JNIEnv *env;
jclass clazz = (*env)->FindClass(env, "class");
  • JavaVM:一个指向Java虚拟机的指针,表示整个JVM实例。
  • jclass:表示Java类的引用。
  • jobject:表示Java对象的引用。
  • jmethodID:表示Java方法的标识符。
  • jfieldID:表示Java字段的标识符。

基础数据类型

!](https://i-blog.csdnimg.cn/direct/1bc956b2ab584e4da6e609f6578af899.png)

引用类型
在这里插入图片描述
类型签名

在这里插入图片描述

  • 简介:是用于描述 Java 方法或字段的特定字符串。JNI 签名是方法描述符的一部分,它包含了方法的参数类型和返回值类型,确保本地代码能够正确调用 Java 方法或访问 Java 字段。每次GetMethodID 或 GetFieldID或者返回数据都会用到。
  • 签名格式:
    方法签名的格式为:(参数类型签名)返回值类型签名
    示例:
int add(int a, int b)(II)I
String getName()()Ljava/lang/String;
void print(String message)(Ljava/lang/String;)V

引用java对象

Field/Method ID:JNIEvn 操作 java 对象时会使用 java 中的反射,引用某个属性都需要 field 和 method 的 id,而id都是指针类型。
实现步骤:

  1. 获取 JNIEnv 指针:
  2. 查找类:
  • 使用 FindClass 函数获取 Java 类的引用。
  • 获取方法 ID 或字段 ID:
  • 使用 GetMethodID 或 GetFieldID 获取方法或字段的标识符。
  1. 操作 Java 对象:
  • 使用 NewObject、CallObjectMethod、SetObjectField 等函数创建或操作 Java 对象。

示例:获取一个class的getName()方法

extern "C" JNIEXPORT jstring JNICALL
Java_com_hzh_jnidemo_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {// 1. 获取 thiz 的 class,也就是 java 中的 Class 信息jclass thisclazz = env->GetObjectClass(thiz);// 2. 根据 Class 获取 getClass 方法的 methodID//GetMethodID/GetFieldI的参数://jclass//filed/methon name //类型签名: JNI 使用 jvm 的类型签名jmethodID mid_getClass = env->GetMethodID(thisclazz, "getClass", "()Ljava/lang/Class;");// 3. 执行 getClass 方法,获得 Class 对象jobject clazz_instance = env->CallObjectMethod(thiz, mid_getClass);// 4. 获取 Class 实例jclass clazz = env->GetObjectClass(clazz_instance);// 5. 根据 class  的 methodIDjmethodID mid_getName = env->GetMethodID(clazz, "getName", "()Ljava/lang/String;");// 6. 调用 getName 方法jstring name = static_cast<jstring>(env->CallObjectMethod(clazz_instance, mid_getName));......}

JNI引用与释放

  • 局部引用(Local Reference):参考java 中的局部变量
    // 查找类jclass myClass = (*env)->FindClass(env, "com/hzh/jnidemo/MainActivity");// 获取方法 IDjmethodID myMethod = (*env)->GetMethodID(env, myClass, "stringFromJNI", "()Ljava/lang/String");// 调用 Java 方法(*env)->CallVoidMethod(env, obj, myMethod);
  • 全局引用(Global Reference):参考java 中的全局变量
 	// 创建局部引用jobject localRef = (*env)->NewObject(env, /* 类和方法 ID 略 */);// 创建全局引用globalRef = (*env)->NewGlobalRef(env, localRef);//释放//局部的释放DeleteLocalRef(localRef)//全局的释放if (globalRef != NULL) {(*env)->DeleteGlobalRef(env, globalRef);globalRef = NULL;}
  • 弱全局引用(Weak Global Reference):参考java 中的弱引用
	// 创建引用jobject localRef =(*env)->NewObject(env, /* 类和方法 ID 略 */);;weakRef = (*env)->NewWeakGlobalRef(env, localRef);//释放DeleteLocalRef(localRef)

cmake配置文件

# 设置最低版本
cmake_minimum_required(VERSION 3.22.1)# 引用的项目名
project("jnidemo")# 创建的库名
add_library(# 库名字${CMAKE_PROJECT_NAME}# 设置是动态库(SHARED)还是静态库(STATIC)SHARED# 设置库文件native-lib.cpp)# 加载的库,比如第三方的库,脚本等
target_link_libraries(${CMAKE_PROJECT_NAME}androidlog)

导入android项目的配置:

   externalNativeBuild {cmake {path file('src/main/cpp/CMakeLists.txt')version '3.22.1'}}

相关文章:

Android之JNI详解

Android之JNI详解 简介创建项目注册动态注册静态注册 关键词解读基础数据类型引用java对象JNI引用与释放cmake配置文件 简介 JNI&#xff08;Java Native Interface&#xff09; 是 Java 提供的一种编程框架&#xff0c;用于在 Java 应用程序中调用和与用其他编程语言&#xf…...

React Hooks: useRef,useCallback,useMemo用法详解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不会参与 UI 渲染&#xff0c;但生命周期要长”的对象引用&#xff0c;比如获取 DOM、保存定时器 ID、WebSocket等。 新建useRef.js组件&#xff0c;写入代码&#xff1a; import React, { useRef, useSt…...

Java基础知识

概念 请介绍全局变量和局部变量的区别 Java中的变量分为成员变量和局部变量&#xff0c;它们的区别如下&#xff1a; 成员变量&#xff1a; 1. 成员变量是在类的范围里定义的变量&#xff1b; 2. 成员变量有默认初始值&#xff1b; 3. 未被static修饰的成员变量也叫…...

体验智能体构建过程:从零开始构建Agent

1. 什么是智能体&#xff1f; 智能体&#xff08;Agents&#xff09;是一种能够感知环境、做出决策并采取行动来实现特定目标的自主实体。智能体的复杂程度各不相同&#xff0c;从简单的响应式智能体&#xff08;对刺激直接做出反应&#xff09;到更高级的智能体&#xff08;能…...

如何从项目目标到成功标准:构建可量化、可落地的项目评估体系

引言 在项目管理领域&#xff0c;"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告&#xff0c;67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时&#xff0c;常会忽视真正的价值创造。本文将通…...

大模型论文:Language Models are Few-Shot Learners(GPT3)

大模型论文&#xff1a;Language Models are Few-Shot Learners(GPT3) 文章地址&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了&#xff0c;扩大语言模型的规模在任务无关的 few…...

驱动学习专栏--字符设备驱动篇--1_chrdevbase

字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC 、 SPI &#xff0c; LCD 等等都是字符设备&…...

muduo库源码分析: TcpConnection

一. 主要成员: socket_&#xff1a;用于保存已连接套接字文件描述符。channel_&#xff1a;封装了上面的socket_及其各类事件的处理函数&#xff08;读、写、错误、关闭等事件处理函数&#xff09;。这个Channel中保存的各类事件的处理函数是在TcpConnection对象构造函数中注册…...

【SLAM】ubuntu 18.04 编译安装 OpenCV 3.2.0 时出现哈希错误

本文首发于❄慕雪的寒舍 1. 前言 1.1. 问题说明 在amd64的ubuntu 18.04 desktop上编译安装 OpenCV 3.2.0 的时候&#xff0c;我遇到了cmake构建错误。错误的核心报错如下 for file: [/home/king/slam/pkg/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32…...

挂马漏洞 asp连接冰蝎webshell (附webshell源码 仅限学习研究)

目录 ASP WebShell代码 代码说明&#xff1a; 部署步骤&#xff1a; 使用冰蝎客户端连接&#xff1a; 注意事项&#xff1a; ASP WebShell代码 <% 冰蝎连接密码&#xff08;需与冰蝎客户端配置一致&#xff09; Dim key key "mysecretkey123" 自定义密码…...

Grafana将弃用AngularJS-我们该如何迁移

AngularJS 弃用时间线 AngularJS 支持已在 Grafana 9 中正式弃用。在 2024 年 5 月发布的 Grafana 11 中&#xff0c;所有 Grafana Cloud 和自托管安装默认关闭该功能。到 Grafana 12 版本时&#xff0c;将完全移除对 AngularJS 的支持&#xff0c;包括配置参数开关 angular_s…...

基于单片机的病房呼叫系统设计

2.1 总体方案设计 本课题为基于单片机的病房呼叫系统设计&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;在此采用八个按键模拟8个不同的病房号&#xff0c;再通过8个LED指示灯对病房号的状态进行指示&#xff0c;当用户按键按键时&#xff0c;相应的LED灯会点亮…...

简述一下Unity的UnityWebRequest

UnityWebRequest是Unity引擎中用于处理网络请求的强大工具&#xff0c;尤其适用于与Web服务器进行交互&#xff0c;比如获取数据、上传文件或下载资源等。相较于旧版的WWW类&#xff0c;UnityWebRequest提供了更灵活、更高效的API&#xff0c;支持多种HTTP方法&#xff0c;并能…...

文件操作和IO - 2

目录 Java 中操作文件 File 概述 属性 构造方法 方法 getParent getName getPath getAbsolutePath getCanonicalPath exists isFile isDirectory createNewFile delete deleteOnExit list listFiles mkdir mkdirs 完&#xff01; Java 中操作文件 Java 对于文件操…...

⑪数据中心网络M-LAG实战

一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…...

Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作

本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写&#xff0c;将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说&#xff0c;立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…...

Node.js种cluster模块详解

Node.js 中 cluster 模块全部 API 详解 1. 模块属性 const cluster require(cluster);// 1. isMaster // 判断当前进程是否为主进程 console.log(是否为主进程:, cluster.isMaster);// 2. isWorker // 判断当前进程是否为工作进程 console.log(是否为工作进程:, cluster.isW…...

Window 10使用WSL2搭建Linux版Android Studio应用开发环境

一、背景 公司基于高通SA8155、SA8295等车载芯片进行座舱系统开发,使用repo统一管理系统及应用源码仓库。 Android应用端使用Ubuntu环境Android Studio进行开发,使用repo进行平台性管理,包含所有应用仓库。由于gradle配置使用了linux下文件软链接,无法直接使用Window环境…...

PostgreSQL 的统计信息

PostgreSQL 的统计信息 PostgreSQL 的统计信息是查询优化和性能调优的基础&#xff0c;系统通过多种统计信息来评估数据分布和访问模式&#xff0c;从而生成高效的执行计划。 一 统计信息类型与用途 1.1 核心统计类别 统计类型存储位置主要用途更新机制表和索引扫描统计pg_…...

【Linux】Linux基础指令

Linux系统初步介绍 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统&#xff61; 严格来讲,Linux 只是操作系统内核本身,但通常采用“Linux内核”来表达该意思&#…...

【SLAM】在ORB_SLAM2的ROS模式下使用RealSense D435相机

本文介绍了如何在ORB_SLAM2项目中使用RealSense D435相机作为RGB-D输入源&#xff0c;包括ROS下启动D435相机、ORB_SLAM2订阅Topic、ORB_SLAM2读取realsense-viewer录制的rosbag文件等步骤。。 本文首发于❄慕雪的寒舍 1. 前言 先前已经编写了如何用TUM数据集运行ORB_SLAM3以及…...

scapy使用

https://scapy.readthedocs.io/en/latest/introduction.html 在 Mac 上使用 Scapy 抓取特定 IP 的流量并保存到 a.pcap 的步骤如下&#xff1a; 步骤 1&#xff1a;安装 Scapy 在终端中执行以下命令安装&#xff1a; pip install scapy步骤 2&#xff1a;创建 Python 脚本 …...

C2000 系统控制(4) — CPU Memory

CPU 内存 内存控制器 在 C2000 实时微控制器上&#xff0c;RAM 具有不同的特性。这些特性包括&#xff1a; CPU 专用&#xff1a;M0、M1 RAMCPU 和 CLA 共享&#xff1a;LSx RAMCPU、DMA 和 HIC 共享&#xff1a;GSx RAM用于在处理器之间发送和接收消息&#xff1a;MSG RAM …...

Linux网络编程——详解网络层IP协议、网段划分、路由

目录 一、前言 二、IP协议的认识 1、什么是IP协议&#xff1f; 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…...

解析医疗器械三大文档:DHF、DMR与DHR

医疗器械的 DHF、DMR 和 DHR 是质量管理体系&#xff08;QMS&#xff09;中的核心文件&#xff0c;贯穿产品全生命周期&#xff0c; 确保医疗器械的安全性、有效性和合规性。 一、三大文件的定义与法规依据 缩写全称法规依据&#xff08;以 FDA 为例&#xff09;核心目的DHF…...

SQL 全文检索原理

全文检索(Full-Text Search)是SQL中用于高效搜索文本数据的技术&#xff0c;与传统的LIKE操作或简单字符串比较相比&#xff0c;它能提供更强大、更灵活的文本搜索能力。 基本概念 全文检索的核心思想是将文本内容分解为可索引的单元(通常是词或词组)&#xff0c;然后建立倒排…...

基于Rosen梯度投影法的约束优化问题求解及MATLAB实现

摘要 在工程优化、经济建模等领域&#xff0c;约束优化问题普遍存在&#xff0c;其核心是在满足线性或非线性约束条件下求解目标函数的极值。本文聚焦Rosen梯度投影法&#xff0c;系统阐述其算法原理、实现步骤及MATLAB编程方法。 关键词&#xff1a;Rosen梯度投影法&#xf…...

Model Context Protocol (MCP) - 尝试创建和测试一下MCP Server

1.简单介绍 MCP是Model Context Protocol的缩写&#xff0c;是Anthropic开源的一个标准协议。MCP使得大语言模型可以和外部的数据源&#xff0c;工具进行集成。当前MCP在社区逐渐地流行起来了。同时official C# SDK(仓库是csharp-sdk) 也在不断更新中&#xff0c;目前最新版本…...

Linux上位机开发实践(关于Qt的移植)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 linux平台上面&#xff0c;很多界面应用&#xff0c;都是基于qt开发的。不管是x86平台&#xff0c;还是arm平台&#xff0c;qt使用的地方都比较多。…...

Node.js 项目 用 `Docker Compose` 发布的完整流程

Node.js 项目 用 Docker Compose 发布的完整流程 ✅ 一、基本项目结构示例 以一个简单 Express 项目为例&#xff1a; my-node-app/ ├── app.js # 启动文件 ├── package.json ├── package-lock.json ├── Dockerfile # 构建 Node 容器 ├…...

Java基础:浅析Java中的XML文件处理

概述 XML&#xff08;全称Extensible Markup Language,可扩展标记语言&#xff09; .本质是一种数据的格式&#xff0c;可以用来存储复杂的数据结构&#xff0c;和数据关系 XML特点 1.XML中的“<标签名>”成为一个标签或者一个元素&#xff0c;一般成对出现的 2.XML…...

MCU刷写——S19(S-Record)文件格式详解及Python代码

工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊S19这种文件的格式,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢…...

HTML — 过渡与动画

HTML过渡与动画是提升网页交互体验的核心技术&#xff0c;主要通过CSS实现动态效果。 过渡 CSS过渡&#xff08;Transition&#xff09;介绍 适用于元素属性变化时的平滑渐变效果&#xff0c;如悬停变色、尺寸调整。通过定义transition-property&#xff08;过渡属性&#xf…...

python【标准库】multiprocessing

文章目录 介绍多进程Process 创建子进程共享内存数据多进程通信Pool创建子进程多进程案例多进程注意事项介绍 python3.10.17版本multiprocessing 是一个多进程标准模块,使用类似于threading模块的API创建子进程,充分利用多核CPU来并行处理任务。提供本地、远程的并发,高效避…...

BANK OF CHINA(HONG KONG)网点

BANK OF CHINA(HONG KONG)网点开户 ZoneBankAddressDates东区杏花邨分行香港柴湾杏花邨东翼商场205-208号20240415: 11:15, 13:00, 11:15, 13:00, 11:15, 13:0020240412: 11:15, 13:00东区鲗鱼涌分行香港鰂鱼涌英皇道1060号柏惠苑20240412: 09:45 注意事项 到达指定分行时&am…...

基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“嗨玩旅游网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…...

机器学习(3)——决策树

文章目录 1. 决策树基本原理1.1. 什么是决策树&#xff1f;1.2. 决策树的基本构成&#xff1a;1.3. 核心思想 2. 决策树的构建过程2.1. 特征选择2.1.1. 信息增益&#xff08;ID3&#xff09;2.1.2. 基尼不纯度&#xff08;CART&#xff09;2.1.3. 均方误差&#xff08;MSE&…...

【人脸识别中的“类内差异”和“类间差异】

核心问题&#xff1a;人脸识别中的“类内差异”和“类间差异” 想象你在教一个小朋友认人&#xff1a; 类间差异&#xff08;不同人之间的区别&#xff09;&#xff1a; 目标&#xff1a;让小朋友能分清“爸爸”和“妈妈”。方法&#xff1a;指着爸爸说“这是爸爸”&#xff0…...

第十六届蓝桥杯 省赛C/C++ 大学B组

编程题目现在在洛谷上都可以提交了。 未完待续&#xff0c;写不动了。 C11 编译命令 g A.cpp -o A -Wall -lm -stdc11A. 移动距离 本题总分&#xff1a;5 分 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标 ( 233 , 666 ) (233, 666) (233,666)。在移动过程…...

SpringBoot3.0 +GraalVM21 + Docker 打包成可执行文件

SpringBoot3.0 GraalVM21 Docker 打包成可执行文件 前言 随着时代的飞速发展&#xff0c;JDK 17 及以上版本开始支持通过 GraalVM 将运行在 JVM 上的 jar 包直接打包成可在操作系统上运行的原生可执行文件。这一特性能使开发者在某些场景下更加灵活地部署 Java 程序。 在云原…...

从编程范式看 “万物皆智能,万事皆自动” 愿景

从编程范式看“万物皆智能,万事皆自动”愿景 引言 在信息技术飞速发展的今天,“万物皆智能,万事皆自动”成为了众多 IT 从业者和科技爱好者心中的终极愿景。这一愿景描绘了一个所有事物都具备智能、所有事情都能自动完成的美好未来。而在实现这一愿景的征程中,面向对象编…...

Vue 项目中 package.json 文件的深度解析

Vue 项目中 package.json 文件的深度解析 在 Vue 项目中&#xff0c;package.json 文件是项目配置的核心&#xff0c;它管理着项目的依赖关系、脚本命令、版本信息等重要内容。正确理解和配置 package.json 文件&#xff0c;对于项目的开发、构建、测试和部署都至关重要。本文…...

解决2080Ti使用节点ComfyUI-PuLID-Flux-Enhanced中遇到的问题

使用蓝大的工作流《一键同时换头、换脸、发型、发色之双pulid技巧》 刚开始遇到的是不支持bf16的错误 根据《bf16 is only supported on A100 GPUs #33》中提到&#xff0c;修改pulidflux.py中的dtype 为 dtype torch.float16 后&#xff0c;出现新的错误&#xff0c;这个…...

1 程序的本质,计算机语言简史,TIOBE 指数,C 语言的独特魅力、发展历程、发行版本和应用场景

&#x1f44b; 嘿&#xff0c;各位编程探险家们&#xff01;是不是一提到 C 语言&#xff0c;脑海中就浮现出指针乱舞、内存泄漏的恐怖画面&#xff1f;别怕&#xff0c;你并不孤单&#xff01;&#x1f605; 今天&#xff0c;你踏入了这个专为 “C 语言恐惧症” 患者打造的避…...

python格式化字符串漏洞

什么是python格式化字符串漏洞 python中&#xff0c;存在几种格式化字符串的方式&#xff0c;然而当我们使用的方式不正确的时候&#xff0c;即格式化的字符串能够被我们控制时&#xff0c;就会导致一些严重的问题&#xff0c;比如获取敏感信息 python常见的格式化字符串 百…...

撰写学位论文Word图表目录的自动生成

第一步&#xff1a;为图片和表格添加题注 选中图片或表格 右键点击需要编号的图片或表格&#xff0c;选择 【插入题注】&#xff08;或通过菜单栏 引用 → 插入题注&#xff09;。 设置题注标签 在弹窗中选择 标签&#xff08;如默认有“图”“表”&#xff0c;若无需自定义标…...

SDC命令详解:使用相对路径访问设计对象(current_instance命令)

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 在使用get_cells等命令访问设计对象时&#xff0c;需要指定设计对象的名字&#xff0c;这个名字是一个相对路径&#xff0c;本文就将对此进行讨论。 相对路径 使…...

vector的应用

在平常使用c是&#xff0c;只使用普通数组肯定不够便捷&#xff0c;这时&#xff0c;我们就可以使用vector来使代码更加简洁 目录 1.vector的定义 2.在vector末尾增加一个元素 3.输出元素 &#xff08;1&#xff09;输出单个元素 &#xff08;2&#xff09;循环输出元素 4…...

pytorch查询字典、列表维度

输出tensor变量维度 print(a.shape)输出字典维度 for key, value in output_dict.items():if isinstance(value, torch.Tensor):print(f"{key} shape:", value.shape)输出列表维度 def get_list_dimensions(lst):# 基线条件&#xff1a;如果lst不是列表&#xff0…...

征程 6 VIO Frame 时间戳介绍

1. 时间类型 征程 6 内部的时间类型如下 Linux 系统时间是基于 arm system counter 抽象的&#xff0c;Linux 的基于 arm system counter 抽象了很多种时间&#xff0c;图中画了两种。CLOCK_MONOTONIC_RAW 是不会被时间同步调整的。 2. Frame 时间戳 从 VIO 侧获取的图像数…...