NDK 开发
HongChengDarren
忘记不了铭记,坚持不了放弃,但只要活着...
展开
-
JNI 基础 - JNIEnv 的实现原理
一.JNI 开发的一般流程在 windows 系统上面我们经常能看到很多类似于 xxx.dll 的文件,在做 android 开发的时候我们能看到很多 xxx.so 的文件。这些都是啥呢?其实就是用 c 和 c++ 实现生成的动态库,供 windows 和 android 系统来调用。我们解压 QQ 和支付宝的 apk 找到它的 libs 目录下,会发现有大量的 .so 库文件,还有很多是...原创 2018-06-22 11:59:40 · 754 阅读 · 0 评论 -
图形图像处理 - 实现图片的美容效果
我们在用美颜相机或者直播时,相信都离不开一个效果那就是 美容 。这次我们就来分析一种常用滤波(双边滤波),刚好就可以实现一些美容效果。**双边滤波(Bilateral Filter)**是非线性滤波中的一种。这是一种结合图像的空间邻近度与像素值相似度的处理办法。在滤波时,该滤波方法同时考虑空间临近信息与颜色相似信息,在滤除噪声、平滑图像的同时,又做到边缘保存。双边滤波采用了两个高斯滤波的结合。一个...原创 2019-01-15 16:40:26 · 550 阅读 · 0 评论 -
Android智能识别 - 银行卡区域裁剪(原理篇)
在 Android智能识别 - 银行卡区域裁剪 一文中我们用了如下几行代码,获取发现银行卡的轮廓: // 梯度增强 , x 轴和 y 轴 Mat grad_x, grad_y; Scharr(blur, grad_x, CV_32F, 1, 0); Scharr(blur, grad_y, CV_32F, 0, 1); Mat grad_abs_x, gra...原创 2019-01-28 11:33:26 · 569 阅读 · 0 评论 -
NDK 开发实战 - 封装 java 层 sdk 模型
关于 Ndk 开发,网上的资料非常少,这方面的书籍也不多。因为其涉及的知识非常广,那么我们可能会问到底要学到什么程度?到底应该怎么学?这期我给大家来做一个简单回答,首先单纯站在 Android 系统的角度来说,我们可以细分为 Java 层和 Native(c/c++) 层。站在 Android 开发的角度来说,我们又可以细分为精通 Android 开发和精通 c/c++ 开发。当然笔者之前在长沙从...原创 2019-02-27 21:04:02 · 3807 阅读 · 0 评论 -
图形图像处理 - 手写 QQ 说说图片处理效果
OpenCv 的基础学习目前先告一段落了,后面我们要开始手写一些常用的效果,且都是基于 Android 平台的。希望我们有一定的 C++ 和 JNI 基础,如果我们对这块知识有所欠缺,大家不妨看看这个:Android进阶之旅(JNI基础实战)我们可能会忍不住问,做 android 应用层开发,学习图形图像处理到底有啥好处?首先不知我们是否有在 Glide 中有看到像这样的源码: privat...原创 2019-02-21 11:10:17 · 481 阅读 · 0 评论 -
NDK 开发实战 - 实现相机美颜功能
在 《图形图像处理 - 实现图片的美容效果》 一文中提到了图片的美容,采用双边滤波算法来实现,具体的算法流程和实现思路,大家可以在上篇文章中了解,这篇文章就在不再反复啰嗦了。这里我们再次来看下处理效果:上面的效果看似好像不错,其实存在了大量的问题。从处理速度上来说,双边模糊算法是在二维的高斯函数上新增像素差值来实现的,使得算法的时间复杂度比较大(处理时间 > 1s),其次从处理效果上来...原创 2019-03-17 16:46:02 · 867 阅读 · 0 评论 -
NDK 开发实战 - 微信公众号二维码检测
关于二维码识别,我们一般都是用的 Zxing 或者 Zbar ,但它们的识别率其实并不是很高,有些情况下是失灵的,比如下面这两张图:使用开源库 Zxing 扫描以上两张二维码,有一张死活不识别。使用微信是可以的,大家可以用支付宝试试(不行),那碰到这种情况到底该怎么办呢?哈哈,这次终于有用武之地了,我们琢磨着来优化一把。我们在微信公众号都用过这么一个功能,长按一张图片,如果该图片包含有二...原创 2019-03-25 19:38:54 · 491 阅读 · 0 评论 -
NDK 开发实战 - 实时人脸检测和识别
关于人脸检测和识别,应用的范围是非常广的,其实之前的《NDK开发前奏 - 实现支付宝人脸识别功能》 也有提到,只是那时并未具体的去分析算法和实现原理,这里笔者打算一步一步来分析和实现人脸识别,首先我们得要明确人脸检测和人脸识别是两个不同的概念,人脸检测是检测有人脸,人脸识别是匹配你是你,他们所采用的算法也是不一样的,这篇文章是基于人脸检测来实现人脸识别。我们先来看下已经实现了的人脸检测效果:人...原创 2019-04-02 21:04:42 · 611 阅读 · 0 评论 -
音视频技术学习 - 启动篇
其实老早就想写一些关于音视频学习的文章了,但由于各方面的原因迟迟都没有开始。一个方面是因为笔者写文章都是成系统的,音视频需要大家有一定的 c/c++ 基础;还有一个方面是因为之前经验不足,这一块涉及到的细节也比较多。我自己学习时看过大量的文章和资料,这里推荐 雷霄骅的专栏 ,虽然文章的更新永远停在了那一刻,但其无私分享的精神值得我们每一个开发者学习。音视频这系列文章我们打算从基础开始学,然后结合移...原创 2019-04-14 19:22:29 · 729 阅读 · 2 评论 -
Android 开发者需要知道的 Linux 知识
去年年底学习了张绍文的《Android开发高手课》,课程真的非常不错,也学到了不少高级知识,好的东西自然是强烈推荐给大家。在《崩溃优化(下):应用崩溃了,你应该如何去分析?》一文中有这么几段话:虚拟内存。虚拟内存可以通过 /proc/self/status 得到,通过 /proc/self/maps 文件可以得到具体的分布情况。有时候我们一般不太重视虚拟内存,但是很多类似 OOM、tgkil...原创 2019-04-22 14:48:09 · 2648 阅读 · 0 评论 -
从 Linux 内核的角度来看 Binder 驱动
关于进程间通信我们是再熟悉不过了,有时面试也经常被问到你了解 IPC 吗?我们一般都会答 AIDL ,Binder 驱动,共享内存?如果要我们再说详细点呢?或者说说共享内存的具体实现?这里推荐一篇罗升阳的博客 《Android进程间通信(IPC)机制Binder简要介绍和学习计划》。本文是基于 linux 进程间通信来写的,我们都知道 Android 是基于 linux 内核,因此了解了 linu...原创 2019-05-12 09:50:41 · 1599 阅读 · 0 评论 -
CMake 语法 - 详解 CMakeLists.txt
关于 《Android 开发者需要知道的 Linux 知识》与 《从 Linux 内核的角度来看 Binder 驱动》两篇文章被锁定,官方申诉也未给予回复,大家可以看这里:https://blog.csdn.net/z240336124/article/details/89451641https://blog.csdn.net/z240336124/article/details/901373...原创 2019-05-27 11:56:02 · 4296 阅读 · 1 评论 -
Shell 脚本 - 自己动手编译 FFmpeg
有了 Makefile、CMake 和 Shell 的基础后,我们就可以自己动手编译 FFmpeg 了。当然网上能找到别人已经有编译好的库文件,我们之所以折腾这么一大圈,还是为了自己以后能去裁剪编译。之前在公司看老大一顿 shell 命令操作,觉得非常的高大上,觉得自己很菜,觉得应该要很多年才能达到这程度吧。自己用心学了才知道,其实也就一周的时间完完全全足够了。我们先来做一些准备工作,准备一台 ...原创 2019-06-03 10:52:32 · 501 阅读 · 0 评论 -
FFmpeg - 打造一款万能的音乐播放器
从 c/c++ 基础、jni 基础、c/c++ 进阶、数据结构和算法、linux 内核、CMake 语法、Shell 脚本绕了一大圈之后,总算是勉强可以来写 FFmpeg 了,以上这些基础大家可以看下之前的文章:《Android进阶之旅 - JNI基础实战》《音视频技术学习 - 启动篇》《Android 开发者需要知道的 Linux 知识》《CMake 语法 - 详解 CMakeList...原创 2019-06-16 00:28:24 · 1343 阅读 · 0 评论 -
FFmpeg - Android 视频播放器
本文的内容是基于 《FFmpeg - 打造一款万能的音乐播放器》 来实现的,源码的地址在我个人的 github 上。我打算再新建一个 VideoPlayer 项目用来实现视频播放,因此本文的流程大致如下: 整合音乐播放器项目,对项目架构进行调整,视频解码播放,音视频同步,陆续完善封装 SDK 。1. 整合音乐播放器项目为了方便大家学习,我们先保留音乐播放器项目,然后把音乐播放器的代码复制过来,...原创 2019-07-04 11:06:46 · 630 阅读 · 0 评论 -
FFmpeg - 朋友圈录制视频添加背景音乐
前几天有同学问了个问题:辉哥,我们录制视频怎么添加背景音乐?就在今天群里也有哥们在问:Android 上传的视频 iOS 没法播放,我怎么转换格式呢?令我很惊讶的是大家似乎不会 FFmpeg 也没有音视频基础,但大家又在做一些关于音视频的功能。搞得我们好像三言两语施点法,就能帮大家解决问题似的。因此打算写下此篇文章,希望能帮到有需要的同学。视频录制涉及到知识点还是挺多的,但如果大家不去细究原理...原创 2019-07-15 14:31:36 · 669 阅读 · 0 评论 -
图形图像处理 - 我们所不知道的 Bitmap
Bitmap 是怎么开辟内存的?内存是怎么复用和销毁的?本地资源图片应该怎么去做适配?打开我们自己的 APP 发现占用内存较大的一般都是本地资源图片,我们该如何去优化这些内存?大家以后如果有涉及直播这一块的业务,直播间会有各种活动和各种复杂动画,线上 buggly 肯定会有大量的 OOM ,我们怎样才能在 OOM 前去 dump 线上内存来做优化分析?Bitmap 我们是再熟悉不过了,首...原创 2019-01-05 11:06:42 · 845 阅读 · 0 评论 -
图形图像处理 - Android 滤镜效果
年初来深圳正式开始从事音视频开发,为啥我想从事音视频开发呢?有一个简单的理由是我想建立起自己的技术壁垒,别人不能做的你能做,别人解决不了的你能解决。我们工作多年甚至于做了几十个项目,如果我们不能从项目中去学习新的东西,那技术就只能停滞不前了。当然有哥们建议我说,你学的东西太多了但是不精,因此同样我也建议大家还是先把 Java 基础和 Android 基础打牢。后面我将写下一些图形图像处理的文章,很...原创 2018-12-10 10:25:20 · 637 阅读 · 1 评论 -
JNI 基础 - Android 共享内存的序列化过程
1. 进程间的通信方式有哪些 2. binder 和 socket 通信的区别有哪些 3. Android 为什么在大部分场景下用 Binder 进行进程间通信 4. Serializable 和 Parcelable 之间的区别 5. Parcelable 序列化和反序列化的具体过程不知道大家在面试中的过程中,有没有碰到上面类似的问题,我在腾讯和 oppo 面试的时候就碰到了,这些问...原创 2018-06-22 12:01:08 · 850 阅读 · 0 评论 -
C进阶 - 内存四驱模型
一.内存四驱模型不知我们是否有读过 《深入理解 java 虚拟机》这本书,强烈推荐读一下。在 java 中我们将运行时数据,分为五个区域分别是:程序计数器,java 虚拟机栈,本地方法栈,java 堆,方法区。在 c/c++ 中我们将运行时数据,分为四个区域分别是:栈区,堆区,数据区,代码区。我们详细来介绍下:栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。堆区:一...原创 2018-06-22 12:01:43 · 393 阅读 · 0 评论 -
C++基础 - 构造函数、析构函数和拷贝构造函数
一.构造函数C++ 中类的构造函数与 java 很类似,其实对于面向对象编程来说,大家伙都是一个思想,可能语法上有所不同而已。class Student{public: // 构造函数 Student(){// 空参数构造函数 cout << "空参数构造函数"<< endl; } // Student(ch...原创 2018-06-22 12:02:17 · 479 阅读 · 1 评论 -
C++进阶 - STL算法设计理念分析
C++ 中 STL 的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。学好 STL 其实主要在于其设计理念和算法实现,再清晰一点其实就是 algorithm(算法)、container(容器)和iterator(迭代器)的分离思...原创 2018-08-03 11:57:34 · 550 阅读 · 0 评论 -
Android智能识别 - 银行卡区域裁剪
在真正开始看这篇文章之前,希望我们能先去了解一下这篇文章《NDK开发前奏 - 实现支付宝人脸识别功能》,此篇文章阅读起来可能会有些许难度,因此我们只要能看懂 c/c++ 语法,能跟上我分析问题的思路就可以了。后面我们会讲一些算法,会去介绍 opencv 的常用函数。当然我们学习 Ndk 主要还是为我们的 Android 来服务的,以便我们能读懂 android 底层源码,能做一些 Ndk 项目开发...原创 2018-08-03 12:00:01 · 1358 阅读 · 0 评论 -
Android智能识别 - 银行卡数字识别
接着上一篇文章 《Android智能识别 - 银行卡区域裁剪》 来说,上一次我们已经截取到了银行卡的数字区域,那么这次我们基于上次截取到的卡号区域,来进行数字识别。有了上面这一块区域之后,我们首先要做的肯定需要转为灰度然后进行二值化。 // 转为灰度 Mat gray; cvtColor(mat, gray, COLOR_BGRA2GRAY); Mat...原创 2018-08-03 12:01:17 · 2259 阅读 · 2 评论 -
数据结构算法 - 数组与链表
是时候来撸一波数据结构和算法了,学完 NDK 自己打算又重新回到 Android 和 Java , 再去抓一些有细节和深度的东西。大学选的是教育专业后来自学的编程,学编程的第一感觉就是可以找一份工作,薪资方面什么的都还好,因为农村孩子家里穷所以就学了。刚开始学习不像现在,谈不上有多喜欢,也没学过什么数据结构和算法,感觉开发中能用到的地方也不多,面试基本也不问(长沙)。前几天在微信公众号看到一篇文章...原创 2018-11-21 16:41:30 · 374 阅读 · 0 评论 -
数据结构算法 - 冒泡、选择和插入排序
排序算法我们一般可以从以下几个方面入手:手写排序算法;时间复杂度,空间复杂度,排序的稳定性;能够了解各大排序算法的优劣,能根据具体的场景选择合适的算法;能够优化排序算法。一.冒泡排序冒泡排序的思想:重复地遍历要排序的列表,比较每一对相邻项,如果它们的顺序不对,就交换它们。重复遍历列表,直到不需要交换。template<typename T>void bubbleS...原创 2018-11-21 16:42:28 · 290 阅读 · 0 评论 -
数据结构算法 - 栈和队列
栈和队列在数据结构和算法学习中,是比较容易理解的。但有时候感觉自己掌握了栈和队列,可是在写的时候遇到不同的情况,就不会处理了,因此自己还是想再总结回顾一下。栈:是一端受限,一端允许进行操作的线性表。即:先放的后取,后放的先取。就是我们通常说的“先进后出”(FILO)。存储结构最常见的有两种:一种是顺序存储,一种是链式存储。其中顺序存储就是之前讲的数组,链式存储就是之前讲的链表。队列:像栈一...原创 2018-11-21 17:07:10 · 380 阅读 · 0 评论 -
数据结构算法 - HashMap 源码深度解析
equals 和 == 的区别,hashCode 与它们之间的联系?HashMap 的长度为什么是 2 的幂次?五个线程同时往 HashMap 中 put 数据会发生什么?ConcurrentHashMap 是怎么保证线程安全的?上面是一些常见的面试题,本文旨在分析 HashMap 的源码实现思想,并不会去细讲这些问题,在我们看完源码之后不妨自己做一些思考。本文也不会细讲 JDK 1....原创 2018-11-21 17:08:22 · 1015 阅读 · 0 评论 -
数据结构算法 - 优先级队列和堆排序
队列是一种特征为FIFO的数据结构,每次都是从队首弹出。优先队列与其不同的是,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。今天我们来读读源码层的优先级队列,到底是怎么实现的,在这之前我们不妨思考一下。如果要我们自己去实现,我们怎么去实现一个优先级队列?存储结构分为数组和链表,假设我们用普通的数组去实现,我们要么入队列的时候找到其合适的位置,让优先级最高的排在数组的最...原创 2018-11-21 17:09:06 · 436 阅读 · 0 评论 -
数据结构算法 - 红黑树
红黑树是一棵自平衡的二叉搜索树,因此在学习红黑树之前,我们需要回顾一下之前所学的知识二叉搜索树和平衡二叉树。1.二叉搜索树二叉搜索树又叫二叉查找树或者二叉排序树,它首先是一个二叉树,而且必须满足下面的条件:1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值3)左、右子树也分别为二叉搜索树2.平衡二叉树二叉搜索树...原创 2018-11-21 17:10:41 · 442 阅读 · 0 评论 -
数据结构算法 - ConcurrentHashMap 源码解析
五个线程同时往 HashMap 中 put 数据会发生什么?ConcurrentHashMap 是怎么保证线程安全的?在分析 HashMap 源码时还遗留这两个问题,这次我们站在 Java 多线程内存模型和 synchronized 的实现原理,这两个角度来彻底分析一下。至于 JDK 1.8 的红色树不是本文探讨的内容,如果感兴趣可以看看之前的文章。1. Java 多线程内存模型五个线...原创 2018-11-21 17:11:55 · 427 阅读 · 0 评论 -
数据结构算法 - LeetCode 刷题
数据结构和算法的课程讲解,目前已告一段落,也算是完成了自己的一个心愿。因为去年听某同学抱怨过,说自己去爱奇艺面试,其他问题都答得不错,面试官问了一个哈夫曼算法的题没答出来,后来面试官很明确的说,我们还是想找一个会些算法基础的。如果之前有学过数据结构和算法,建议大家不定时的去刷刷算法题,因为从面试的角度来讲,目前 BAT 和 TMD 等一线互联网企业或多或少都会有几个算法题,而对应届毕业生来说算法...原创 2018-11-21 17:12:26 · 774 阅读 · 0 评论 -
Android 性能优化实战 - 界面卡顿
今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿的问题,问我能不能帮忙解决下。由于性能优化涉及的知识点比较多,我一时半会也无法彻底回答。恰好之前在做需求时也遇到了一个卡顿的问题,因此今晚写下这篇卡顿优化的文章,希望对大家有所帮助。先来看看卡顿的现象:1. 查找卡顿原因从上面的现象来看,应该是主线程执行了耗时操作引起了卡顿,因为正常滑动是没问题的,只有在刷新数据的时候才会出现卡顿。至于什么...原创 2018-11-21 17:13:21 · 1155 阅读 · 0 评论 -
FFmpeg - Android 直播推拉流
1. 搭建自己的流媒体服务器在实际的开发过程中,我们是可以不用自己来搭建流媒体服务器的,访问后台的接口会返回媒体房间和 IM 房间。但现在我们自己测试就无法用公司的接口了,当然也可以去抓一些第三方的直播接口,我强烈不推荐大家这么做。最好的办法就是自己搭建一个简单的流媒体服务器。首先登录自己的云主机,下载解压 nginx 和 rtmpsudo wget https://github.com/...原创 2019-07-23 17:06:54 · 2740 阅读 · 1 评论