React Native本地通知与JNI

React Native本地通知与JNI:跨平台原生能力集成深度解析

关键词:React Native、本地通知、JNI、Android原生开发、iOS原生模块、跨平台桥接、移动应用开发

摘要:本文深入探讨在React Native中实现本地通知功能的核心技术,重点解析通过Java Native Interface (JNI) 集成Android原生通知能力的原理与实践。从React Native桥接机制的底层逻辑出发,详细阐述Android端JNI开发流程、iOS原生模块实现以及跨平台统一接口设计。通过完整的项目实战案例,演示如何构建高性能、高兼容性的本地通知解决方案,涵盖开发环境配置、原生代码编写、JS端接口调用及常见问题处理。适合有React Native开发经验并希望深入掌握原生模块集成的开发者阅读。

1. 背景介绍

1.1 目的和范围

在移动应用开发中,本地通知是提升用户粘性的核心功能之一。React Native作为主流跨平台框架,提供了基于JavaScript的统一开发体验,但复杂的原生功能(如Android特定的通知渠道管理、iOS的UNNotification框架深度集成)仍需依赖原生模块实现。本文聚焦以下内容:

  • React Native与原生平台的通信机制(桥接模块原理)
  • Android端通过JNI实现原生通知功能的底层技术
  • iOS端原生模块的标准开发流程
  • 跨平台统一接口的设计与实现
  • 实战项目中性能优化与兼容性处理

1.2 预期读者

  • 具备React Native基础的前端开发者
  • 希望掌握原生模块集成的跨平台开发者
  • 对JNI技术在移动开发中应用感兴趣的工程师
  • 从事移动应用架构设计的技术负责人

1.3 文档结构概述

  1. 背景与基础概念:明确技术目标、术语定义及架构原理
  2. 核心技术解析:深入React Native桥接机制与JNI工作原理
  3. 平台实现细节:分Android(含JNI)和iOS讲解原生模块开发
  4. 实战案例:完整项目流程演示,包括环境搭建、代码实现与调试
  5. 应用与优化:典型场景分析、性能优化及兼容性方案
  6. 资源与总结:推荐学习资料,展望技术发展趋势

1.4 术语表

1.4.1 核心术语定义
  • React Native桥接模块:连接JS层与原生层的通信组件,通过RCTBridgeModule(iOS)或ReactContextBaseJavaModule(Android)实现
  • 本地通知:无需网络连接,由设备本地触发的通知,支持定时、事件触发等模式
  • JNI (Java Native Interface):允许Java代码调用C/C++代码的接口规范,用于集成原生底层库
  • 通知渠道(Android):Android 8.0+引入的通知分类管理机制,每个渠道可独立配置外观和行为
  • UNNotification (iOS):iOS 10+的统一通知框架,支持丰富的通知交互功能
1.4.2 相关概念解释
  • 原生模块(Native Module):React Native中封装原生功能的组件,分为UI组件(View Manager)和非UI模块(纯逻辑模块)
  • 异步通信:JS与原生层通过事件循环实现非阻塞通信,使用Promise或回调函数处理异步结果
  • NDK (Native Development Kit):Android官方工具集,用于编译C/C++代码为原生库(.so文件)
1.4.3 缩略词列表
缩写全称
JSJavaScript
RNReact Native
JNIJava Native Interface
NDKNative Development Kit
UNUser Notification (iOS)

2. 核心概念与架构原理

2.1 React Native跨平台通信架构

React Native的核心架构基于**桥接层(Bridge)**实现JS与原生代码的双向通信,其核心流程如下:

调用原生模块方法

返回结果或事件

RCTBridge

平台判断

Android原生模块

iOS原生模块

执行原生逻辑(如JNI调用)

执行iOS原生逻辑

2.2 Android端JNI技术原理

JNI允许Java代码与C/C++代码交互,核心步骤包括:

  1. 定义Native方法:在Java接口中声明需由C/C++实现的方法
  2. 生成头文件:通过javah工具生成对应的.h头文件
  3. 实现C/C++代码:根据头文件实现具体逻辑
  4. 加载原生库:通过System.loadLibrary()加载编译后的.so文件
JNI数据类型映射
Java类型JNI类型C类型
booleanjbooleanunsigned char
intjintint
Stringjstringconst char*
Objectjobjectvoid*

2.3 本地通知核心组件对比

功能特性Android(通过JNI)iOS(原生模块)
通知渠道管理必须实现(API 26+)无(通过UN框架配置)
定时触发AlarmManager/C++UNTimeIntervalTrigger
富媒体支持RemoteViews/C++渲染UNNotificationAttachment
点击事件处理PendingIntent回调UNNotificationCenterDelegate

3. 核心实现原理与代码解析

3.1 Android端JNI开发流程(通知核心逻辑)

3.1.1 定义Java Native接口
// NotificationJNI.javapackagecom.rnlocalnotifications;publicclassNotificationJNI{static{System.loadLibrary("notification-jni");// 加载原生库}// 声明原生方法:创建通知渠道publicnativevoidcreateNotificationChannel(StringchannelId,Stringname,intimportance);// 声明原生方法:显示通知publicnativevoidshowNotification(intnotificationId,Stringtitle,Stringbody);}
3.1.2 生成JNI头文件
# 在项目根目录执行javac src/main/java/com/rnlocalnotifications/NotificationJNI.java javah -jni -d src/main/cpp com.rnlocalnotifications.NotificationJNI
3.1.3 实现C++逻辑(关键部分)
// notification-jni.cpp#include<jni.h>#include<android/native_window_jni.h>#include<android/bitmap.h>#include"com_rnlocalnotifications_NotificationJNI.h"// 全局变量存储上下文JavaVM*gJavaVM=nullptr;jobject gContext=nullptr;// 初始化上下文(由Java层调用)extern"C"JNIEXPORTvoidJNICALLJava_com_rnlocalnotifications_NotificationJNI_init(JNIEnv*env,jobject thiz,jobject context){env->GetJavaVM(&gJavaVM);gContext=env->NewGlobalRef(context);}// 创建通知渠道(JNI实现)extern"C"JNIEXPORTvoidJNICALLJava_com_rnlocalnotifications_NotificationJNI_createNotificationChannel(JNIEnv*env,jobject thiz,jstring channelId,jstring name,jint importance){// 转换Java字符串到C++constchar*cChannelId=env->GetStringUTFChars(channelId,nullptr);constchar*cName=env->GetStringUTFChars(name,nullptr);// 调用Android原生API创建渠道(需通过JNI获取Context)JNIEnv*localEnv;gJavaVM->AttachCurrentThread(&localEnv,nullptr);jclass contextClass=localEnv->GetObjectClass(gContext);jmethodID getSystemServiceMethod=localEnv->GetMethodID(contextClass,"getSystemService","(Ljava/lang/String;)Ljava/lang/Object;");jstring serviceName=localEnv->NewStringUTF(android::context::NOTIFICATION_SERVICE);jobject notificationManager=localEnv->CallObjectMethod(gContext,getSystemServiceMethod,serviceName);// 省略后续渠道创建代码(需处理API版本兼容)localEnv->ReleaseStringUTFChars(channelId,cChannelId);localEnv->ReleaseStringUTFChars(name,cName);}

3.2 iOS端原生模块实现(UNNotification框架)

3.2.1 定义桥接模块接口
// RNLocalNotificationModule.h #import <React/RCTBridgeModule.h> #import <UserNotifications/UserNotifications.h> @interface RNLocalNotificationModule : NSObject <RCTBridgeModule, UNUserNotificationCenterDelegate> @end
3.2.2 实现通知注册与触发
// RNLocalNotificationModule.m #import "RNLocalNotificationModule.h" @implementation RNLocalNotificationModule RCT_EXPORT_MODULE(LocalNotificationManager); // 模块名称 // 注册通知权限(导出到JS) RCT_EXPORT_METHOD(requestPermission:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { [UNUserNotificationCenter currentNotificationCenter].delegate = self; [UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { [UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (error) { reject(@"PERMISSION_ERROR", error.localizedDescription, error); } else { resolve(@(granted)); } }; } else { resolve(@(settings.authorizationStatus == UNAuthorizationStatusAuthorized)); } }]; } // 触发定时通知(导出到JS) RCT_EXPORT_METHOD(scheduleNotification:(NSInteger)notificationId title:(NSString *)title body:(NSString *)body fireDate:(NSDate *)fireDate) { UNMutableNotificationContent *content = [UNMutableNotificationContent new]; content.title = title; content.body = body; content.sound = [UNNotificationSound defaultSound]; UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateComponents:[NSCalendar currentCalendar] componentsFromDate:fireDate options:UNCalendarNotificationTriggerStrictDateMatching]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:[NSString stringWithFormat:@"%ld", (long)notificationId] content:content trigger:trigger]; [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (error) { RCTLogError(@"Failed to schedule notification: %@", error.localizedDescription); } }]; } @end

4. 跨平台接口设计与桥接实现

4.1 统一JS接口定义

// LocalNotification.jsimport{NativeModules}from'react-native';constNativeModule=NativeModules.LocalNotificationManager;exportdefault{// 初始化通知(Android需创建渠道)initialize(channelId,channelName,importance){if(Platform.OS==='android'){NativeModule.initializeNotificationChannel(channelId,channelName,importance);}},// 显示立即通知showNotification(notificationId,title,body){NativeModule.showNotification(notificationId,title,body);},// 定时通知scheduleNotification(notificationId,title,body,fireTime){if(Platform.OS==='ios'){NativeModule.scheduleNotification(notificationId,title,body,fireTime);}else{// Android通过AlarmManager实现NativeModule.scheduleAndroidNotification(notificationId,title,body,fireTime.getTime());}}};

4.2 Android原生模块桥接(结合JNI)

// AndroidNotificationModule.javapackagecom.rnlocalnotifications;importcom.facebook.react.bridge.ReactApplicationContext;importcom.facebook.react.bridge.ReactContextBaseJavaModule;importcom.facebook.react.bridge.ReactMethod;importcom.facebook.react.bridge.Promise;importandroid.app.NotificationManager;importandroid.app.NotificationChannel;importandroid.os.Build;publicclassAndroidNotificationModuleextendsReactContextBaseJavaModule{privatestaticfinalStringMODULE_NAME="LocalNotificationManager";privatefinalReactApplicationContextreactContext;privateNotificationJNInotificationJNI;publicAndroidNotificationModule(ReactApplicationContextreactContext){super(reactContext);this.reactContext=reactContext;// 初始化JNI上下文notificationJNI=newNotificationJNI();notificationJNI.init(reactContext.getApplicationContext());}@OverridepublicStringgetName(){returnMODULE_NAME;}// 导出到JS的初始化方法(创建通知渠道)@ReactMethodpublicvoidinitializeNotificationChannel(StringchannelId,StringchannelName,intimportance){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){notificationJNI.createNotificationChannel(channelId,channelName,importance);}}// 导出到JS的立即通知方法@ReactMethodpublicvoidshowNotification(intnotificationId,Stringtitle,Stringbody){// 调用JNI实现的通知逻辑notificationJNI.showNotification(notificationId,title,body);}}

5. 项目实战:完整开发流程

5.1 开发环境搭建

5.1.1 初始化RN项目
npx react-native init RNNotificationDemo --template react-native-template-typescriptcdRNNotificationDemo
5.1.2 配置Android NDK(JNI所需)
  1. android/local.properties中添加:
ndk.dir=C:\\Android\\Sdk\\ndk\\25.2.9517442 # 根据实际路径修改
  1. 修改android/app/build.gradle
android { defaultConfig { ndk { abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.18.1" } } }
5.1.3 配置iOS原生模块

ios/RNNotificationDemo/Podfile中添加:

pod'React-Core',:path=>'../node_modules/react-native/'pod'UserNotifications','~> 1.0'

然后执行:

cdios&&podinstall&&cd..

5.2 原生代码实现(关键部分)

5.2.1 Android JNI相关文件结构
android/app/src/main/ ├── cpp/ │ ├── CMakeLists.txt │ ├── notification-jni.cpp │ └── com_rnlocalnotifications_NotificationJNI.h ├── java/com/rnlocalnotifications/ │ ├── NotificationJNI.java │ └── AndroidNotificationModule.java
5.2.2 iOS桥接文件

创建ios/RNNotificationDemo/bridging-header.h(如果使用Swift需配置桥接):

#import "RNLocalNotificationModule.h"

5.3 JS端调用示例

// App.tsximportReact,{useEffect}from'react';import{View,Button}from'react-native';importLocalNotificationfrom'./LocalNotification';constApp:React.FC=()=>{useEffect(()=>{// 初始化Android通知渠道(重要等级高)LocalNotification.initialize('default_channel','General Notifications',4);},[]);constshowImmediateNotification=()=>{LocalNotification.showNotification(1,"RN Notification Demo","This is an immediate notification!");};constscheduleDailyNotification=()=>{constfireTime=newDate();fireTime.setHours(9,0,0);// 每天9点触发LocalNotification.scheduleNotification(2,"Daily Reminder","Time to start your day!",fireTime);};return(<View style={{flex:1,justifyContent:'center',alignItems:'center'}}><Button title="Show Immediate Notification"onPress={showImmediateNotification}/><Button title="Schedule Daily Notification"onPress={scheduleDailyNotification}/></View>);};exportdefaultApp;

6. 实际应用场景与最佳实践

6.1 典型应用场景

  1. 社交应用:好友请求、消息提醒(需区分紧急程度,通过Android渠道管理)
  2. 电商APP:限时优惠提醒、物流状态更新(结合定时触发与富媒体展示)
  3. 工具类应用:日程管理、任务倒计时(精确的时间触发与重复提醒)
  4. 健康类应用:运动目标提醒、喝水定时通知(低功耗后台触发)

6.2 性能优化策略

  1. 通知频率控制:通过队列机制合并高频通知,避免资源浪费
  2. JNI性能优化
    • 减少跨语言调用次数,批量处理通知参数
    • 使用缓存机制存储常用通知配置(如渠道信息)
  3. iOS定时器优化
    • 使用UNTimeIntervalTrigger替代老旧的NSTimer
    • 合并相似触发时间的通知请求

6.3 兼容性处理方案

平台版本处理方案
AndroidAPI < 26忽略渠道创建,使用默认通知设置
AndroidAPI >= 33动态申请通知权限(通过NotificationManager
iOS< 10回退到UILocalNotification(需额外兼容代码)
通用后台状态使用PendingIntentUNNotificationServiceExtension处理点击事件

7. 工具与资源推荐

7.1 学习资源推荐

7.1.1 书籍推荐
  1. 《React Native跨平台开发实战》 - 孙源
  2. 《JNI权威指南》 - 李刚
  3. 《iOS应用开发指南:从零基础到App Store上架(第7版)》 - 刘航
7.1.2 在线课程
  1. React Native官方培训课程
  2. Android NDK开发入门与实践
  3. iOS通知与用户互动高级课程
7.1.3 技术博客与网站
  • React Native中文网
  • Android开发者文档(JNI部分)
  • iOS开发者文档(UNNotification框架)

7.2 开发工具推荐

7.2.1 IDE与编辑器
  • Android Studio(含NDK开发工具)
  • Xcode(iOS原生开发)
  • VS Code(RN项目开发,推荐插件:React Native Tools)
7.2.2 调试工具
  • React Native Debugger(JS层调试)
  • Android Profiler(CPU/GPU性能分析)
  • Xcode Instruments(iOS性能剖析)
7.2.3 相关库与框架
  • react-native-notifications:社区常用通知库(封装度高,跨平台支持)
  • react-native-permissions:权限管理辅助库
  • date-fns:日期处理工具(定时通知时间计算)

7.3 相关论文与案例

  1. 《A Comparative Study of Cross-Platform Mobile Development Frameworks》 - ACM SIGSOFT
  2. 《Optimizing JNI Performance in Android Applications》 - Google Developer Summit 2019
  3. 《Designing Scalable Notification Systems for Mobile Apps》 - Uber Engineering Blog

8. 总结:未来趋势与挑战

8.1 技术发展趋势

  1. 跨平台框架深化:React Native、Flutter等框架对原生能力的封装越来越完善,减少直接操作JNI的需求
  2. 通知智能化:结合AI实现通知内容个性化(如根据用户行为动态调整通知频率和内容)
  3. 多端统一体验:本地通知与远程通知(如FCM、APNs)的深度整合,实现全平台一致的推送体验

8.2 关键技术挑战

  1. 原生模块兼容性:不同Android版本和iOS机型的通知行为差异,需持续维护兼容性代码
  2. JNI开发复杂度:C/C++代码的内存管理风险,以及与现代Java/Kotlin代码的协作问题
  3. 性能与功耗平衡:高频通知对电池寿命的影响,需要更智能的触发机制(如结合设备状态判断)

8.3 实践建议

  • 优先使用社区成熟库(如react-native-notifications),仅在需要深度定制时开发原生模块
  • 对JNI代码进行严格的单元测试,使用Google Test等框架确保稳定性
  • 采用模块化设计,将通知配置、触发逻辑与平台特定代码分离,提升可维护性

9. 附录:常见问题解答

Q1:为什么在Android中需要使用JNI而不是直接用Java?

A:JNI主要用于集成已有的C/C++库(如高性能通知处理逻辑)或访问更低层系统功能。如果是纯Java实现的通知模块,直接使用原生模块即可,无需引入JNI。

Q2:iOS端通知点击后如何唤醒JS页面?

A:通过实现UNUserNotificationCenterDelegate- (void)userNotificationCenter:didReceiveNotificationResponse:方法,将点击事件通过桥接模块传递给JS层,触发页面跳转逻辑。

Q3:Android通知渠道创建失败怎么办?

A:确保在API 26+设备上调用,检查渠道ID是否唯一,重要等级是否在NotificationManager.IMPORTANCE_LOWIMPORTANCE_HIGH之间。

Q4:JNI开发中如何处理内存泄漏?

A:严格遵循JNI内存管理规则,及时释放jstringjobject等本地引用,使用NewGlobalRefDeleteGlobalRef管理全局引用。

10. 扩展阅读与参考资料

  1. React Native原生模块开发官方文档
  2. Android通知渠道官方指南
  3. iOS通知框架迁移指南(UILocalNotification到UNNotification)
  4. JNI编程规范与最佳实践

通过深入理解React Native桥接机制与JNI技术,开发者能够突破跨平台框架的功能边界,实现与原生系统的深度整合。本地通知作为典型场景,展示了如何在保持JS开发效率的同时,充分利用Android和iOS的底层能力。随着移动应用对用户体验要求的不断提升,掌握这类混合开发技术将成为跨平台开发者的核心竞争力。

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

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

相关文章

在 Ubuntu 18.04 (WSL) 上配置 LazyVim

在 Ubuntu 18.04 (WSL) 上配置 LazyVim 的终极指南&#xff1a;解决 GLIBC 和 Tree-sitter 依赖难题 前言 在 Ubuntu 18.04 这种“古董”系统上安装现代化的 Neovim 配置&#xff08;如 LazyVim&#xff09;是一场噩梦。 LazyVim 要求 Neovim > 0.10&#xff0c;而 Ubuntu 1…

【超全解析】前端如何优雅地判断是否为移动端?从 UA 检测到现代解决方案

【超全解析】前端如何优雅地判断是否为移动端&#xff1f;从 UA 检测到现代解决方案 在前端开发中&#xff0c;「判断当前访问设备是否为移动端」几乎是一个绕不开的问题。 无论是 响应式布局、条件渲染、跳转 H5 / PC 站点、性能优化&#xff0c;还是 埋点分析&#xff0c;都可…

Linux Kernel 4.4 `printk` 源码分析与使用详解

Linux Kernel 4.4 printk 源码分析与使用详解 参考资料&#xff1a;百问网 - UART子系统Kernel版本&#xff1a;Linux 4.4.154开发板&#xff1a;Firefly-RK3288关键文件&#xff1a;kernel/printk/printk.c, include/linux/kern_levels.h 一、printk 的基本使用与打印级别 调…

融合DWA的青蒿素优化算法(Artemisinin Optimization Algorithm, AOA)求解无人机三维动态避障路径规划附MATLAB代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

【课程设计/毕业设计】基于python-cnn机器学习的罗马数据集训练识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

在Windows11下编译openjdk 21

在Windows11下编译openjdk 21 下载openjdk 20作为boot jdk&#xff0c;假设我下载解压后的路径如下 D:\Downloads\jdk-20.0.2_windows-x64_bin\jdk-20.0.2首先下载Cygwin&#xff0c;因为这是在Windows中模拟UNIX&#xff0c;在安装程序界面选择要安装的包 autoconf make zip u…

5G时代下联邦学习在AI原生应用中的新机遇

5G联邦学习&#xff1a;AI原生应用的下一个爆发点 一、引言&#xff1a;AI原生应用的“数据困局”与破局之道 清晨7点&#xff0c;自动驾驶汽车在早高峰的车流中平稳行驶&#xff0c;它通过路侧单元&#xff08;RSU&#xff09;实时获取前方施工路段的临时交通灯信息&#xff0…

【四旋翼控制】基于6自由度四旋翼跟踪轨迹(利用LQR整体动作设定点控制,姿态控制和PD路径跟踪控制器Matlab仿真)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

牙齿拥挤数据集3206张yolo

牙齿拥挤数据集3206张VOCYOLO格式 数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;3206 Annotations文件夹中xml文件总计&#xff1a;3206 labels文件夹中txt文件总…

Microsoft 开发的关系型数据库管理系统(RDBMS)

SQL Server 简介 SQL Server 是由 Microsoft 开发的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;支持企业级数据管理、分析和应用开发。其核心功能包括数据存储、事务处理、商业智能&#xff08;BI&#xff09;和高可用性解决方案。 SQL Server 版本 企业…

Java进阶知识-反射

获取Class对象 有三种方式获取Class对象&#xff1a;根据类的完整包名获取Class Class clazz Class.forName(“com.example.xjp.demo.reflect.PersonInfo”);根据类名直接获取Class Class clazz PersonInfo.class;根据实例类的对象获取Class PersonInfo personInfo new Pers…

Gemini认证疑难解答会

Gemini认证疑难解答会通常是指围绕Google推出的Gemini大模型系列在使用、集成或开发过程中遇到的技术问题进行讨论与解决的会议或交流活动。这类会议可能由开发者社区、企业技术团队或Google官方组织&#xff0c;旨在帮助用户更好地理解Gemini API的认证机制、权限配置、访问控…

Django 视图基础

Django 视图基础Django 视图是处理用户请求并返回响应的核心组件。视图可以是函数或类&#xff0c;通常定义在 views.py 文件中。函数视图示例&#xff1a;from django.http import HttpResponsedef hello_world(request):return HttpResponse("Hello, World!")类视图…

Java 进阶:异常影响性能吗?

Java 进阶异常影响性能吗 catch 中不做任何事情catch 中输出异常到日志catch 中获取异常栈总结 Java 进阶&#xff1a;异常影响性能吗&#xff1f; 曾经在给一个业务系统增加限流功能&#xff0c;使用的限流组件在流量超过阈值时&#xff0c;会直接抛异常&#xff0c;异常导…

【Qt改变虚拟键盘的大小】

默认情况下qtvirtualkeyboard占据了半个屏幕 可以通过修改源码的方式来修改其大小。 1.找到desktopinputpanel.cpp,参考路径 2.修改show函数注释的代码为源文件原来的代码。 3.键盘样式修改需要修改对应的qml文件&#xff0c;路径为qtvirtualkeyboard/src/virtualkeyboard/cont…

java进阶训练营 极客,关于架构极客大学java进阶训练营

C语言中&#xff0c; 数组[2]属于结构数据类型。一个数组能够合成为多个数组元素&#xff0c;这些数组元素能够是根本数据类型或是构造类型。因而按数组元素的类型不同&#xff0c;数组又可分为数值数组、字符数组、指针数组、构造数组等各种类别。 对于可变长数组(VLA)的问题&…

Java进阶整理

对于一个程序员不能只是停留在满足平常的业务开发的水平&#xff0c;所以今天来整理一下Java的进阶知识。 通过以下几个方面来讲一讲Java的进阶知识&#xff1a; Jvm Jvm结构类加载对象的分配过程 、对象存储布局Java的内存模型、GC&#xff08;MinorGC&#xff08;新生代&a…

java头歌-数组进阶

第一关 public static void main(String[] args) {//动态构建arr1int[] arr1 new int[3];Scanner sc new Scanner(System.in);for(int i 0 ; i< arr1.length ; i){arr1[i] sc.nextInt();}/********** Begin **********///创建数组arr2int[] arr2 new int[3];for (int i…

java进阶知识点

java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达&#xff0c;将一些事情整好了反过来传给需要用到的地方~ 这样做得好处&#xff1a;做到了单一职责&#xff0c;并且提高了复用性&#xff0c;解耦了之后&#xff0c;任你如何实现&#xf…

破解空间困局:看紧凑型ARM工控机如何一机多能

在智能工厂的角落、自动化产线的缝隙、或是移动设备的内部&#xff0c;工程师们常常面临一个经典难题&#xff1a;空间极其有限&#xff0c;但需要连接和控制的设备却一点不少。 摄像头、传感器、PLC、扫码枪、显示屏、机械臂……每一个都需要一个“对话”的接口。传统的工控机…