- 博客(163)
- 收藏
- 关注
原创 JNI技术之手写JNIEnv与静态缓存与native异常
本文展示了两种NDK(JNI)开发中的优化技术。第一部分演示了通过NDK实现数组排序,在C++层使用qsort算法对Java传递的整型数组进行高效排序,并通过日志输出验证了排序结果。第二部分重点介绍了静态缓存技术,通过将频繁访问的Java字段ID(jfieldID)在C++层缓存为静态变量,避免了重复获取字段ID的性能开销。文中提供了完整的代码示例,包括Java端的调用和C++层的实现,展示了如何初始化、使用和清理静态缓存资源,以提高JNI调用的性能。
2026-04-11 16:57:08
80
原创 JNI技术之动态注册与JNI线程实战
JNI函数注册与线程实践 JNI函数注册分为静态和动态两种方式: 静态注册:通过固定命名规则实现,简单直观但函数名冗长,不支持混淆 动态注册:在JNI_OnLoad中手动绑定,函数名自由且支持混淆,性能更优 线程实践要点: 使用JavaVM全局变量实现跨线程操作 通过AttachCurrentThread获取线程专属的JNIEnv 使用NewGlobalRef提升局部引用为全局引用 线程操作完成后需调用DetachCurrentThread 动态注册相比静态注册更具灵活性,适合实际项目开发。多线程操作时需注
2026-03-25 16:01:16
220
原创 JNI技术之QQ语言变声实现
本文介绍了Android应用中实现声音特效功能的项目结构布局和界面设计。项目目录结构包括:assets目录存放MP4音频文件,cpp/inc存放FMOD头文件,main/jniLibs存放各CPU架构的so库,app/lib存放FMOD的jar包。界面采用RelativeLayout布局,包含一个全屏文本显示区和底部操作栏,操作栏提供6种声音特效按钮(原声、萝莉、大叔、惊悚、搞怪、空灵),每个按钮配有图标和文字说明。MainActivity.java文件负责处理声音特效逻辑,通过onClick事件调用相应功
2026-03-18 23:34:59
146
原创 扑克牌消消乐(连续三张相同消除)
摘要: 题目描述扑克牌消消乐游戏规则:连续3+张相同牌可消除(保留count%3张),消除后拼接剩余牌继续检查,直至无法消除。解题采用模拟+循环压缩方法,用List存储卡牌,编写compress函数处理每轮消除(保留count%3张),循环调用直至结果不变。示例输入10张牌,经两轮消除后剩余"3"。算法高效,适用于n≤52的情况。 (字数:150)
2026-03-12 15:59:02
56
原创 JNI技术之C++层玩转Java层的对象
本文介绍了JNI中数组操作的方法。代码演示了如何在C++层处理Java传递的数组参数,包括基本数据类型数组和引用类型数组。通过JNIEnv提供的函数,如GetIntArrayElements()和GetObjectArrayElement(),可以获取Java数组并在C++层进行操作。同时还展示了数组元素的修改、释放以及日志打印等操作。对应的Java层代码通过native方法声明和按钮点击事件触发JNI调用,实现了Java与C++之间的数组数据交互。
2026-03-08 17:05:24
41
原创 JNI技术之JNI交互与预处理器
文章摘要 本文主要介绍了C++预处理器的基本概念和使用方法,包括宏定义、条件编译等操作。通过代码示例展示了#define、#ifdef、#ifndef等预处理指令的实际应用,并分析了宏函数的优缺点。此外还讲解了JNI(Java Native Interface)的概念及其与NDK的关系,说明了JNI如何实现Java与本地代码(C/C++)的交互。文章最后给出了一个Android项目中通过JNI修改Java变量的简单示例。这些内容涵盖了从基础语法到实际项目应用的知识点,对理解C++预处理和Java本地接口开发
2026-03-02 19:55:41
663
原创 C++高级之手写智能指针与类型转换
本文介绍了C++智能指针的使用及其实现原理。主要内容包括: 智能指针的基本使用(shared_ptr)解决内存泄漏问题,通过自动管理堆内存对象的释放; 智能指针的循环引用问题及解决方案(weak_ptr),通过弱引用打破循环依赖; unique_ptr独占式智能指针的特性; 手写智能指针的实现原理,包括引用计数机制和拷贝控制。 智能指针通过引用计数自动管理内存,避免了手动delete的遗漏风险,但需要注意循环引用问题。unique_ptr提供独占所有权,而weak_ptr可解决shared_ptr的循环依赖
2026-02-28 13:54:20
393
原创 C++高级之引用进阶与多线程
本文摘要主要介绍了C++中的引用进阶、线程编程相关内容: 引用进阶部分展示了引用的本质是指针,通过交换数值的例子比较了指针和引用的使用方式差异,并探讨了左值/右值引用的应用场景。 线程编程部分包含: C++11自带Thread的基本使用,包括线程创建和join等待 Pthreads线程库的详细使用,包括线程创建、参数传递和三种控制方式: main函数直接结束 使用sleep等待 使用join精确等待线程结束 区分了分离线程(独立运行)和非分离线程(协作执行)的概念及应用场景 文中通过代码示例展示了这些核心概
2026-02-26 22:04:36
178
原创 C++高级之C++算法包源码全盘阅读与算法包实战
本文介绍了C++ STL中的函数适配器和常用算法。主要内容包括:1) 使用bind2nd函数适配器解决equal_to比较问题;2) for_each遍历容器的实现方式;3) transform变换操作符的两种使用方式;4) find和find_if查找元素的区别。通过源码分析展示了算法包的工作原理,包括迭代器使用和仿函数应用。这些STL工具可以简化容器操作,提高代码效率。
2026-02-25 23:01:35
242
原创 C++高级之C++内部源码阅读与手写多元谓词
本文介绍了C++中map和multimap容器的使用,以及仿函数(谓词)的相关知识。主要内容包括: map容器学习: 四种插入数据的方式及特点 迭代器遍历和查找操作 判断插入成功/失败的方法 multimap容器学习: 支持重复key且自动排序 分组查询功能的实现 遍历和查找特定key的操作 仿函数(谓词): 仿函数与普通函数的区别 一元谓词的使用场景 仿函数在STL算法中的应用 回调函数与仿函数的对比 文章通过代码示例展示了这些容器的基本操作和特性,以及仿函数的定义和使用方式。
2026-02-25 16:44:26
308
原创 C++高级之SLT中的容器学习与函数谓词
本文介绍了C++ STL中四种常用容器的使用方法:vector向量、stack栈、queue队列和priority_queue优先级队列。vector是一个动态数组容器,支持插入、删除和迭代器遍历操作;stack遵循后进先出原则,提供push/pop操作;queue遵循先进先出原则,常用于任务调度;priority_queue则在queue基础上增加了元素优先级排序功能,默认从大到小排列。每种容器都有其特定的应用场景和操作方法,文中通过代码示例详细展示了各容器的基本使用方式,包括元素操作、遍历和注意事项。
2026-02-24 21:46:02
242
原创 C++二义性,多态,纯虚函数和模版函数
本文摘要: 属性初始化:介绍了C++中三种对象成员初始化方式,包括构造函数列表初始化、对象直接赋值和构造函数初始化。 虚继承与二义性:通过继承关系展示了多继承导致的二义性问题,使用虚继承(virtual)可解决重复继承问题。 多态实现: 动态多态:通过虚函数(virtual)实现运行时多态,子类重写父类虚函数 静态多态:通过函数重载实现编译期多态 纯虚函数:相当于Java抽象类,包含纯虚函数(=0)的类不能实例化,子类必须实现所有纯虚函数。 应用示例:以Android Activity为例,展示了纯虚函数在
2026-02-24 16:23:48
218
原创 C++面向对象继承与操作符重载
本文介绍了C++中运算符重载的三种实现方式: 类外运算符重载:通过全局函数实现运算符重载,但无法直接访问类的私有成员,需要通过getter方法间接访问。 类内运算符重载:将运算符重载作为类的成员函数实现,可以直接访问私有成员。展示了+、-、++、<<、>>等运算符的重载实现,包括使用常量引用提高性能的方法。 括号运算符重载:通过重载[]运算符实现类似数组访问的功能,展示了如何创建一个简单的容器类并重载[]运算符。 三种方式都演示了如何通过运算符重载使自定义类型支持类似内置类型的操作,
2026-02-23 23:10:13
240
原创 C++语言之this原理与友元函数友元类
本文摘要: C++可变参数实现:通过<stdarg.h>头文件支持可变参数函数,使用va_list、va_start、va_arg和va_end宏处理参数,需注意参数边界检查。 C++ static关键字规则: 静态成员必须类外初始化(如int Dog::id = 9;) 静态函数只能访问静态成员 可通过类名::静态成员或对象.静态成员访问 this指针的作用: 区分同名的成员变量和局部变量 隐含传递对象地址(类型* const) 静态成员没有this概念,属于类共享 const成员函数: 默认
2026-02-22 18:29:55
160
原创 C++浅拷贝与深拷贝的原理
本文通过代码示例分析了C++中拷贝构造函数与析构函数的执行流程。主要结论包括:1)默认拷贝构造函数执行浅拷贝,会导致堆内存重复释放问题;2)自定义拷贝构造函数需实现深拷贝,为指针成员分配独立内存;3)对象传值调用时会触发拷贝构造,函数返回时自动调用析构。关键点在于理解浅拷贝与深拷贝的区别,以及对象生命周期中构造与析构的时序关系。通过内存地址打印和析构顺序观察,验证了深拷贝能有效避免重复释放问题。
2026-02-21 23:41:39
343
原创 C++语言类中各个重要函数原理
本文主要讲解了C++中的命名空间和构造函数/析构函数相关内容。在命名空间部分,展示了自定义命名空间的定义和使用方法,包括命名空间嵌套和多级调用。构造函数部分详细介绍了不同参数构造函数的定义和调用方式,以及构造函数初始化列表的用法。析构函数部分说明了对象销毁时的资源释放操作,并对比了new/delete和malloc/free的区别。最后简要提及了Java/Kotlin中类似析构机制的finalize方法。全文通过代码示例展示了C++面向对象编程的核心概念,特别是内存管理和命名空间组织的实践方法。
2026-02-16 20:06:01
243
原创 C++语言学习之面向对象
本文主要探讨了C语言与C++语言的核心区别: 语言特性差异:C++支持面向对象编程,具有命名空间、引用等特性,而C语言是面向过程的。C++可以调用C代码,反之则不行。 常量处理:C语言的常量本质上是"假常量",可通过指针修改;而C++的常量是真正的不可修改量。 引用机制:C++引入引用概念,函数参数传递时引用与原变量共享内存地址,实现高效的数据交换。 函数特性:C++支持函数重载和默认参数,而C语言不支持。文中还展示了特殊参数写法在实际开发中的应用场景。 这些差异体现了C++在C语言基础
2026-02-13 16:35:26
190
原创 C语言文件加解密
本文介绍了C语言中文件操作的基本方法,包括文件读写、复制、获取文件大小以及加密解密操作。主要内容有: 文件读取:使用fopen()打开文件,fgets()逐行读取内容,最后用fclose()关闭文件 文件写入:以"w"模式打开文件自动创建新文件,使用fputs()写入内容 文件复制:通过二进制模式(rb/wb)读取和写入文件,使用fread()和fwrite()实现高效复制 获取文件大小:利用fseek()将指针移动到文件末尾,再用ftell()获取字节数 文件加密解密:通过异或运算对每
2026-02-13 10:53:55
170
原创 结构体与结构体指针数组
主题 关键点结构体 数据聚合、栈/堆分配、指针操作、数组应用动态内存 malloc/free 配对使用,避免内存泄漏typedef 消除编译器差异,实现跨平台代码统一枚举 提升代码可读性,替代魔法数字
2026-02-13 09:31:31
220
原创 指针实战运用进阶之字符串操作
本文介绍了C语言中字符串操作的几种常见方法:1)字符串的两种定义方式(字符数组和字符指针)及其修改特性差异;2)通过指针遍历获取字符串长度的手写API实现;3)字符串转换(atoi/atof)和比较(strcmp/strcmpi)函数的使用;4)字符串查找(strstr)、拼接(strcat)等操作;5)大小写转换的自定义函数实现;6)字符串截取的两种实现方案(栈区和堆区内存分配)。文中通过代码示例展示了指针在字符串操作中的核心作用,同时强调了内存管理的注意事项。
2026-02-12 16:02:53
173
原创 静态开辟内存与动态开辟内存
本文探讨了C语言中静态与动态内存开辟的差异及应用场景。静态开辟使用栈区内存,大小固定且有限(约2MB),适合确定大小的需求;动态开辟则通过malloc在堆区分配内存,容量更大(约40MB),适用于需要灵活调整内存的情况。文章详细介绍了动态内存管理的核心操作:malloc分配内存、realloc调整大小及free释放内存,并强调避免野指针和悬空指针的重要性。最后通过用户输入数组大小的实例,展示了动态内存分配的典型应用场景,体现了其灵活扩展的优势。
2026-02-12 15:33:10
212
原创 函数指针与指针运算
本文摘要:通过C语言代码示例展示了指针的核心概念与应用。包括多级指针的解引用(**num_ppp获取值)、数组与指针的关系(数组名即首元素地址)、指针遍历数组的3种方式(arr[i]、(arr+i)、*arr+i的区别)、指针类型的作用(决定偏移量和取值方式),以及函数指针实现回调机制。重点解析了指针运算的底层逻辑,如指针加减时的字节偏移量计算,并通过sizeof验证了不同指针类型在内存中的存储特性。最后通过opreate函数演示了如何将函数指针作为参数传递实现回调功能。
2026-02-12 11:14:39
414
原创 基于LLM + GitLab Webhook实现AI代码自动化审查
摘要 本文介绍了一个基于GitLab Webhook和大语言模型(LLM)的自动化AI代码审查系统。该系统在用户提交或更新Merge Request时自动触发,通过AI分析代码变更并生成专业诊断报告与修改建议,结果自动同步到GitLab评论区辅助人工评审。系统支持文件后缀过滤、多项目Prompt配置、MR体量限制、分支跳过规则等功能,兼容各类支持OpenAI标准接口的LLM服务。配置包含GitLab连接信息、LLM接口参数、审查策略及分支匹配规则等,通过Flask服务实现核心流程,为代码审查提供智能化辅助。
2026-02-11 16:19:19
1154
原创 C语言指针入门与基本数据类型
本文摘要: 文章主要介绍了Android NDK开发工具包的基本概念与组成,包括其定义、作用(开发C/C++动态库、交叉编译等)和特点(高效、安全、易移植)。随后详细讲解了C语言的基础知识:代码结构、基本数据类型及其占位符、指针概念(地址操作、修改值)以及函数参数传递(通过指针修改实参)。重点内容包括指针的定义与使用(*p操作)、函数间通过指针交换变量值、以及指针与内存地址的关系。文章通过多个代码示例演示了指针在C语言中的核心应用场景。
2026-02-04 11:12:54
240
原创 Android 16KB 腾讯Mars XLog适配
本文详细介绍了在Windows环境下编译和适配Android 16k XLog的全过程。主要内容包括:Python3、NDK、CMake和Cygwin的安装配置;XLog的编译步骤及注意事项;针对NDK r19+版本的特殊处理,如修改build_android.py中的ANDROID_STL_FILE路径和使用llvm-strip工具。文章还提供了编译后的so文件路径说明,并指出执行strip操作可显著减小文件体积。整个流程涵盖了从环境搭建到最终编译成功的完整指南,为开发者提供了Android 16k XL
2026-02-02 18:20:08
794
原创 一篇搞定Kotlin协程(进阶篇)
本文主要介绍了Kotlin协程的取消机制。通过cancel()方法可以取消协程执行,协程会抛出CancellationException异常并进入取消状态。文章详细讲解了Job的生命周期状态转换,以及如何通过isActive检查协程状态来正确终止循环任务。同时对比了join()和await()在取消时的不同行为,join()会等待协程完成,而await()会立即抛出异常。最后介绍了使用try-catch-finally块来释放协程取消时需要清理的资源。这些机制可以帮助开发者更好地管理协程生命周期。
2026-01-30 18:05:42
681
原创 一篇搞懂Kotlin协程(基础篇)
Android协程是一种简化异步编程的轻量级解决方案,通过挂起机制实现非阻塞操作。它支持结构化并发,内置取消功能,并集成Jetpack组件。协程可以通过runBlocking(阻塞线程)、launch(不阻塞)和async(返回结果)三种方式构建。launch适合无需返回值的场景,async则用于并发任务和结果获取。协程能有效避免主线程卡顿,减少内存泄漏,是处理耗时任务(如网络请求)的理想选择。依赖库为kotlinx-coroutines-core和kotlinx-coroutines-android。
2026-01-23 11:00:03
662
1
原创 重学设计模式之拦截器和责任链
摘要:本文探讨了拦截器模式在软件设计中的应用,重点分析了其与责任链模式的结合实现。拦截器通过在执行流程中插入处理点来检查、修改或替换数据和行为,而无需修改原有代码。责任链模式将多个拦截器组织成处理流水线,每个拦截器可决定是否传递请求或直接响应。文章提供了Kotlin实现示例,展示了日志、校验和认证拦截器的协同工作,并解释了其在支付场景中的实际应用,如免密支付和预订单创建流程的灵活处理。这种设计实现了职责分离、可插拔扩展和短路机制等优势。
2026-01-17 10:46:49
708
原创 一篇搞懂Kotlin协程(原理篇)
Kotlin协程通过挂起函数(suspend)和CPS转换,将异步回调代码简化为同步写法。协程编译器自动将suspend函数转换为带Continuation回调的异步代码,实现线程切换。这种机制避免了回调地狱,使异步代码更简洁易读。核心原理是:挂起函数在执行IO操作时挂起协程,完成后恢复执行后续代码,整个过程通过Continuation对象控制流程。协程通过编译期转换,在保持同步代码风格的同时实现了异步执行。
2026-01-05 14:54:51
1136
原创 一篇搞定注解在Android的应用
Java注解(Annotation)是JDK5.0引入的元数据机制,用于将元数据与程序元素关联。注解分为标准注解(如@Override、@Deprecated)和元注解(如@Target、@Retention)。@Target指定注解应用范围,@Retention定义注解保留策略(SOURCE、CLASS、RUNTIME)。SOURCE级别注解仅用于源码检查,如@IntDef可用于限定参数取值,提供编译时语法检查而不增加运行时开销。注解通过@interface或annotation class声明,是Jav
2025-12-27 20:07:24
957
原创 Git “cherry-pick“ 命令详解和应用场景
Git cherry-pick 是一个选择性复制提交到当前分支的命令,适用于同步特定功能或修复而非整个分支合并。其基本语法支持挑选单个、多个或连续范围的提交,并提供-n(不自动提交)、-x(记录来源)等实用选项。使用时可能遇到冲突,需手动解决后继续或终止操作。高级技巧包括处理合并提交和批量压缩提交,但需谨慎避免对公共分支频繁操作导致历史混乱。最佳实践是优先考虑merge/rebase,使用-x追踪来源,并避免重复cherry-pick同一提交。
2025-12-23 14:04:07
953
原创 Android数据库Room之基本使用
摘要:Room是Android JetPack组件中的ORM数据库框架,由Google官方维护。它包含Entity(数据表)、Dao(数据访问对象)和Database(数据库管理)三个核心组件,支持SQL语句高亮和编译检查。使用Room需添加依赖并配置编译器选项,通过注解定义表结构(@Entity)和CRUD操作(@Insert/@Query等)。Database类需继承RoomDatabase并采用单例模式管理。Room自动生成实现类,支持Kotlin协程/RxJava,提供类型安全的数据库操作方案。(1
2025-12-20 10:30:23
1008
1
原创 Android广告投放过程分析
本文系统介绍了移动应用深度链接技术及其在Android平台的应用实现。首先从运营角度区分了深度链接和延迟深度链接的概念,前者直接引导用户至应用内特定页面,后者先引导未安装用户下载应用。然后详细解析了Android平台三种链接类型:深度链接(支持自定义URI)、网页链接(HTTP/HTTPS)和Android App Links(需autoVerify验证)。文章还阐述了Appsflyer的OneLink技术实现,包括直接深度链接和延迟深度链接的工作流程,以及广告投放中的归因机制。最后简要介绍了两种常见广告投
2025-11-26 18:11:50
1068
原创 SYN关键字辨析,各种锁优缺点分析和面试题讲解
本文详细解析了Java中synchronized的实现原理和锁的优化机制。synchronized基于Monitor对象实现同步,通过对象头的MarkWord存储锁信息,包含偏向锁、轻量级锁和重量级锁三种状态。文章分析了自旋锁的优缺点及适用场景,比较了不同锁状态的性能特点,并指出锁只能升级不能降级。最后通过面试题形式讨论了synchronized修饰方法与可见性问题,以及悲观锁/乐观锁的区别。关键点包括:锁状态转换、自旋锁优化、偏向锁适用场景等,为理解Java同步机制提供了全面指导。
2025-11-01 17:49:42
991
原创 AQS底层原理、运用和volatile详解
摘要 本文介绍了阻塞队列和线程池的概念及其应用。阻塞队列是一种支持线程安全的队列,常用于生产者-消费者模式,平衡生产与消费速度。常见的阻塞队列包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等,各有不同的实现方式和适用场景。线程池(ThreadPoolExecutor)通过复用线程降低资源消耗,提高响应速度和管理性,适用于高并发任务处理。文章详细分析了线程池的参数配置、核心类关系及不同阻塞队列的特性,如DelayQueue适用于延迟
2025-10-25 20:47:36
662
原创 并发基础知识补全和CAS原理
本文介绍了Java中线程的启动方式和死锁问题。启动线程主要有两种方式:继承Thread类或实现Runnable接口。文章重点讲解了死锁的四个必要条件:互斥条件、占用并等待、不可抢占和循环等待,并通过示例代码演示了死锁的产生过程。为避免死锁,提出了三种解决方案:按固定顺序加锁、使用超时机制(tryLock)和随机退避策略。这些方法通过破坏死锁的必要条件来预防死锁发生,确保多线程程序的安全运行。
2025-10-19 16:39:43
860
原创 多线程性能优化基础
本文介绍了Java多线程编程中的锁机制和生产者消费者模型的实现。在锁机制部分,分别讲解了类锁、对象锁和显示锁的应用场景及实现方式,包括synchronized关键字和ReentrantLock的使用规范。生产者消费者模型部分通过代码示例展示了共享资源的安全问题,指出由于线程间资源不共享导致的数据不一致问题。文章强调了多线程编程中同步机制的重要性,为处理并发问题提供了基础解决方案。
2025-10-17 21:28:03
716
原创 线程与进程理论知识入门
本文主要探讨了CPU核心数、线程数与多线程编程的关系。首先解释了CPU多核心和多线程技术的基本概念,指出核心数与线程数通常为1:1关系,但超线程技术可实现1:2。接着介绍了CPU时间片轮转机制,分析了时间片设置对系统性能的影响。在进程和线程部分,强调进程是资源分配的最小单位,线程是CPU调度的最小单位。文章还区分了并发(交替执行)和并行(同时执行)的概念,并阐述了高并发编程的优势:提高CPU利用率、加快响应速度、实现模块化编程,同时提醒注意线程安全、死锁和资源耗尽等问题。最后指出Java程序天生就是多线程的
2025-10-08 21:31:45
746
原创 Android性能优化之Apk瘦身
【摘要】随着业务迭代,APK体积逐渐增大,影响应用性能。本文介绍了APK组成结构及多种优化方法:1)使用Android Size Analyzer插件分析体积;2)通过shrinkResources移除未使用资源,配合Lint工具物理删除;3)配置resConfigs保留指定语言资源;4)动态库优化,按CPU架构分包;5)使用矢量图替代位图,通过tint属性复用资源。这些方法可有效减少APK大小,提升加载速度和运行效率。(150字)
2025-09-27 18:53:34
699
原创 Android模拟简单的网络请求框架Retrofit实现
本文介绍了静态代理和动态代理两种设计模式。静态代理通过中介类间接访问目标对象,实现业务逻辑与控制分离,但每个接口需要单独编写代理类,导致代码冗余。动态代理在运行时动态生成代理类,可同时代理多个接口,避免重复代码。静态代理适用于简单场景,而动态代理更灵活,适合接口频繁变化的系统。两种代理都能在不修改目标对象的前提下增强功能,但动态代理的扩展性更优。
2025-09-06 22:41:50
1071
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅