Android JNI
顾修忠
我想要简单的生活,生活却不让我简单。
展开
-
Android音视频【三】硬解码播放H264
人间观察穷人家的孩子真的是在社会上瞎混遥远的2020年马上就过去了,天呐!!!前两篇介绍了下H264的知识和码流结构,本篇就拿上篇从抖音/快手抽离的h264文件实现在Android中进行解码播放&以及介绍所涉及的知识。本文代码用kotlin来写,最近在学习ing,加油吧,打工人,你要悄悄打工。视频效果文章搞不了视频,贴个图吧。软硬编解码在介绍前我们需要知道什么是软硬编解码?1.软编解码:是利用软件本身或者说是使用CPU对原视频进行编解码的方式。优点:兼容性好。缺点:C.原创 2020-12-26 13:31:15 · 5872 阅读 · 5 评论 -
Android-JNI开发系列《十二》总结JNI知识体系
人间观察人啊不能读太多的书不能用圣人的话看这个世道不然会看走了眼本篇对jni知识体系的进行总结,本来是写完Android平台下的对mp3编解码后总结的,但是我想了下mp3编解码后续单独文章介绍会更好。大家平时可能都有一种体验,就是接受的知识都是被动的,经常是被看公众号,文章,视频,但都很杂且不成体系,看了就忘。或者压根就没有太多时间特别是工作996大小周的,导致自己完全被日常业务代码所困而没有太多的技术体系和深度和新技术的学习了解。所以我们要建立自己的知识体系才行,所谓知识体系就是给你一个.原创 2020-12-03 17:52:42 · 228 阅读 · 0 评论 -
Android-JNI开发系列《十一》实践-利用Android C源码实现GIF图片的播放
人间观察人往往都是多面性的,一个人的时候是一个样子,一群人的时候是另一个样子。声明此篇文章只为记录和学习JNI以及了解GIF的解码原理。借鉴了网上的有关gif文章介绍和代码。如果是自己学习,建议自己边敲一遍jni的代码,不要眼高手低。建议如果在项目中使用实现GIF的播放的功能,建议java版本glide的解码GIF或者c版本的https://github.com/koral–/android-gif-drawable为什么呢? 因为我测试了下多个gif文件用glide或者android-g.原创 2020-11-27 23:05:58 · 2431 阅读 · 2 评论 -
Android-JNI开发系列《十》实践利用libjpeg-turbo完美压缩图片不失真
人间观察步入社会后,你会发现,老人说的话都是对的。前面讲了些Android的jni知识和bitmap的实践,接下来几篇应该都是Android中jni的一些实践。这篇我们对Android中图片在jni层利用libjpeg-turbo进行大小压缩,并且压缩后不失真,清晰度和原图基本无差别。背景libjpeg开源的JPEG图像库,它使用非常广泛,Android也依赖libjpeg来压缩图片,但是Android不是直接使用libjpeg,而是基于一个叫Skia的开源项目来作为的图像处理引擎,Skia对l.原创 2020-11-21 10:18:14 · 3660 阅读 · 7 评论 -
Android-JNI开发系列《九》实战-Bitmap处理实现底片灰度化黑白化暖冷色调等效果
人间观察当你喜欢一个人的时候,总是小心翼翼的,笨笨的,傻傻的,生怕做错了什么,又怕不做什么~到此,Android中基本的JNI基础知识以及常见的基本操作差不多就基本讲完了。我们来实践一下,本文实现的是对Android Bitmap的处理: 对一张图片进行处理,照片底片效果,黑白化,灰度化,左右翻转,暖色,冷色,高斯模糊等等,市场上有很多这种处理图片的app,就看谁的算法足够厉害强大。效果图如下在Android中JNI层操作bitmap的需要链接系统的动态库nigraphics 图像库.原创 2020-11-07 16:49:32 · 726 阅读 · 0 评论 -
Android-JNI开发系列《八》CMakeLists.txt语法&使用
人间观察你说命重要还是钱重要,如果想不明白,去趟医院吧!技术在永远在不断的更新升级,Android也一样。目前在Android中的JNI开发都是采用的CMake进行编译c,c++代码构建项目,早期都是Android.mk、Application.mk文件来构建项目的。那CMake是啥呢?简单的说它是一个跨平台的编译工具,它可以用简单的配置文件就可以生成编译的中间产物(Makefile 或者 project 文件),然后用make生成可执行的文件。CMake官网地址 CMake官网在Andro.原创 2020-11-01 16:45:42 · 1529 阅读 · 0 评论 -
Android-JNI开发系列《七》补充jni与java的数据类型的对应关系和数据类型描述符
人间观察人只有不为生存而烦恼的时候,才会追求真正想要的东西。在前面的几篇文章中有涉及到Java和JNI的通信,比如异常回调,Java和JNI的互相调用等。其中都免不了在通信过程中需要知道Java基本数据类型,引用类型和JNI的对应关系以及基本数据类型,引用类型的类型描述符,才能够通信和使用。这个是很重要的,是基础,有必要单独来记录下。在 JNI 开发中,Java 的数据类型并不是直接在 JNI 里使用的,例如 int 就在JNI中是使用 jint 来表示的。数据类型对应基本数据类型:Jav.原创 2020-10-30 19:56:08 · 367 阅读 · 2 评论 -
Android-JNI开发系列《六》jni与java的交互
人间观察1024-程序员节愿各位程序员历尽千帆,归来仍是少年。这片文章本来不打算写的,因为在前面的文章多多少少的提到了jni和java的交互,但是为了让知识体系更健全写,还是梳理下,算是jni和java的在交互上的一个总结吧。两者的交互归纳起来主要就是两种。java调用jni。比如:传递基本数据,复杂对象等jni调用java。比如回调,异常,调用java方法/成员变量,构造java对象等等java调用jni-传到复杂对象到jni中我们新建一个java的对象,然后传递到jni中,在jn.原创 2020-10-24 14:43:55 · 1266 阅读 · 4 评论 -
Android-JNI开发系列《五》局部引用&全局引用&全局弱引用&缓存策略
人间观察好像什么都来得及,又好像什么都来不及。本篇文章主要介绍在jni开发中常见的三种引用的使用方法和注意事项以及jni和java交互的缓存策略。我们知道Java是一门纯面象对象的语言,除了基本数据类型外,其它任何类型所创建的对象的内存都存在堆空间中。内存由JVM 的GC(Garbage Collection)垃圾回收进行管理。但是对于c,c++中以及用c/c++编写的jni来说同样需要手动管理和处理内存,特别是引用类型的对象。malloc,realloc,free ,delete ,不像jav.原创 2020-10-17 17:03:15 · 2175 阅读 · 6 评论 -
Android-JNI开发系列《四》Native-Crash定位
人间观察你有多久没有十点之前睡过觉了。假期ing~~~在Android中进行JNI的开发的当然也会发生crash,而发生crash后比较难定位。因为jni是使用C/C++来进行开发的,熟悉C/C++语言的同学都知道,指针和内存申请的使用时需要自己申请和释放的,它不像java那样有jvm有垃圾回收管理机制gc,稍微管理不当就会导致问题。比如:内存地址访问错误、堆栈溢出、指针使用错误等等,最后都会导致程序崩溃。幸好Android NDK提供了一些工具来帮助精确定位到出问题的代码。我们模拟一下cr.原创 2020-10-10 09:50:46 · 1203 阅读 · 0 评论 -
Android-JNI开发系列《三》-异常处理
人间观察做个俗人,得之坦然,失之淡然,顺其自然吧!假期ing,~~~今天我们讲Android JNI下的异常处理,在java中有异常处理机制,在jni中也一样。回顾java异常我们知道在java中分为运行期异常和编译期异常。运行期异常时是程序在执行期间发生的异常,如果没有捕获可能导致程序不正常(轻者可能功能不正常,重则程序直接crash )。编译期异常是代码编译期间必须显示捕获的异常。throws Exception {} ,try{} catch{} finally{}今天我们不讲这.原创 2020-10-03 11:28:47 · 883 阅读 · 1 评论 -
Android-JNI开发系列《二》-在jni层的线程中回调到java层
人间观察忽有故人心上头,回首山河已是秋。马上国庆+中秋了。万千的风景也比不上回家的美丽~~~今天我们看一个比较常见的场景:在java中处理一个高含量机密的代码/处理较复杂/耗时的数据(比如bitmap的特效处理),这时候就需要用c/c++实现。当在c/c++处理完后需要异步回调/通知到java中,这样代码看起来才很优雅有气质。如果你知道这个知识那就return吧。~~在Android中你可以用Thread+Handler很容易的来实现,我相信你闭着眼都能写了。但在jni层中不是这么简单的,我.原创 2020-09-26 11:15:00 · 2419 阅读 · 0 评论 -
Android-JNI开发系列《一》-动态库的函数注册
JNI-动态库的函数注册时光荏苒,距离上次的文章已经3年多了。那这3年干啥了呢?平凡生活,在人间凑数。来吧,展示!show me you code在Linux平台下so库分为动态库和静态库。表现形式以.so为后缀动态库和.a为后缀的静态库。关于这2个的有关知识这里不过多介绍,不是我们今天的重点。在动态库里函数注册分为2种:静态注册和动态注册。静态注册静态注册,你工作如果是与jni打交道。我们平时写的,写一个jni方法和它对应的头文件(方法名,参数进行对应)。调用的时候,这个调用的过程就是静态注册原创 2020-09-22 13:59:15 · 424 阅读 · 0 评论