安卓NDK开发
文章平均质量分 59
安卓ndk开发:jni基础、ndk工具使用、音视频开发等技术
Aruba233
人生就是不断的超越自我
而超越自我需要不断的坚持
展开
-
JNI--基本介绍和使用
JNI全名为:Java Native Interface,用于连接Java和C/C++桥梁,通过JNI,Java语言可以调用C/C++的函数,反之C/C++也可以调用Java的变量和方法,一般使用环境为:当Java满足不了程序的需要,如算法、图像渲染等高性能消耗操作时,需要访问一些C/C++代码提高性能NDK:工具的集合。帮助开放者快速开放C/C++ 动态库的工具。开发JNI不是必须使用NDK,...原创 2020-04-06 16:29:54 · 148 阅读 · 0 评论 -
JNI--非静态native方法使用及c/c++调用Java变量
上次说到了JNI调用的具体步骤,先再JAVA类中定义了静态native方法,使用javah命令生成c/c++的head文件,再实现相应的c或者c++函数,今天来看下java非静态native方法在JNI中如何使用在上次的类中定义非静态native方法:getStringFromC2()package com.aruba.jniapplication;public class JniDemo...原创 2020-04-07 10:19:49 · 221 阅读 · 0 评论 -
JNI--c/c++调用Java方法
上次说到c/c++调用Java的变量,同样的c/c++也可以调用Java的方法1.c/c++native方法调用Java非静态方法首先看下我们Java的类package com.aruba.jniapplication;import java.util.Random;public class JniDemo2 { static { System.load("...原创 2020-04-07 15:18:57 · 221 阅读 · 0 评论 -
JNI--解决中文乱码问题
我们定义一个native方法用来获取c/c++返回的字符串package com.aruba.jniapplication;public class JniDemo3 { static { System.load("C:\\Users\\tyqhc\\source\\repos\\JniApplication\\x64\\Debug\\JniApplication....原创 2020-04-07 22:54:06 · 158 阅读 · 0 评论 -
JNI--数组的访问
今天来使用JNI对数组操作,数组分为基本类型数组和引用类型数组,首先来看下基本类型数组的使用1.基本类型数组我们在java中定义一个方法,传入一个int型数组,使用c++进行排序package com.aruba.jniapplication;/** * JNI访问数组 */public class JniDemo4 { static { System.l...原创 2020-04-08 14:45:20 · 89 阅读 · 0 评论 -
JNI--局部引用,全局引用,弱全局引用
JNI中有三种引用1.局部引用--定义方式多样:FindClass,NewObject,GetObjectClass,NewCharArray.... NewLocalRef()我们一般的变量就是局部引用,不能在多线程里面使用释放方式: 1 方法调用完JVM 会自动释放 2.DeleteLocalRef。JNI中同一时间最多使用512个局部引用,所以我们有必要去手动释放//局部引用JNI...原创 2020-04-08 15:35:47 · 174 阅读 · 0 评论 -
JNI--异常处理
JAVA中可以使用try catch捕获异常,那么JNI中如果发生了异常会是什么现象呢?我们在JAVA中定义native方法,并调用package com.aruba.jniapplication;/** * JNI 引用 */public class JniDemo6 { static { System.load("C:\\Users\\tyqhc\\so...原创 2020-04-09 14:21:29 · 361 阅读 · 0 评论 -
JNI--动态注册
之前使用到JNI中,都是通过javah命令生成对应c/c++中的方法名,其规则为:java的包名+native方法名,我们把它称作静态注册。JNI还可以使用动态注册,在JNI源码中,安卓系统(PathClassLoader)加载so文件时,首先会调用一个方法:JNI_OnLoad;这是系统预留给外部使用动态注册使用的,今天来使用动态注册的方式调用JNI方法首先在AS中创建一个NDK工程,创建如...原创 2020-04-11 15:24:50 · 138 阅读 · 0 评论 -
JNI--static静态修饰符和弱引用联合使用会出现的bug
当static的修饰符出现是,表明该变量为静态变量,当我们为一个局部静态变量赋一个局部引用时(jstring,jclass,jint等),gc有可能会因为内存不够自动触发,回收局部引用,这时,局部静态变量就会出现野指针,如果不作异常处理则程序崩溃//缓存策略和弱引用联合使用带来的问题JNIEXPORT jstring JNICALL Java_JniMain_AcessCacheNewStri...原创 2020-04-13 09:00:30 · 275 阅读 · 0 评论 -
NDK--CMakeLists配置第三方so库
当我们创建一个NDK工程时,会自动创建一个CMakeLists.txt的文件,在AS中c++的编译器是使用LLVM,规则为cmake,今天来学习下cmake的基本套路首先,我创建了两个NDK工程,第一个工程为lib,为第二个工程提供so库我们修改cpp文件,新增一个求和方法#include <jni.h>#include <string>int sum...原创 2020-04-13 11:05:30 · 414 阅读 · 0 评论 -
NDK--文件的拆分和合并
断点续传中,我们需要将一个文件拆分多个文件,并通过多线程上传,今天利用JNI实现文件的拆分和合并,调用c/c++的方式,性能会有所提升。1.创建文件工具类这边将文件封装成c++类,减少了繁琐的操作_FileClass.h//// Created by aruba on 2020/4/16.//#ifndef FILECLASS_H#define FILECLASS_H#inc...原创 2020-04-17 09:10:39 · 66 阅读 · 0 评论 -
NDK--C语言线程运用及jni创建线程
关于linux中线程的知识:https://blog.csdn.net/wucz122140729/article/details/98588567关于linux中线程同步的知识:https://blog.csdn.net/wucz122140729/article/details/98589012linux线程是由进程模拟,和进程没有什么本质上的区别,相比于进程,线程在使用上便利很多,线...原创 2020-04-19 14:33:28 · 238 阅读 · 0 评论 -
JNI--MicrosoftWindows平台下使用bsdiff生成差分文件的运用
增量更新是很多大型企业常用的技术,目的是为了节省服务器流量来更新版本,运用范围也非常广泛,pc客户端,游戏,移动端应用,甚至服务器代码更新都可以使用。今天来介绍微软windows平台下如何使用增量更新对于服务器而言,增量更新一般是对旧版本文件和新版本文件进行差分,形成差分文件对于客户端而言,增量更新一般是拿到服务器的差分文件,和旧版本文件进行合并,形成新版本文件所以对于服务器开发者而言,只需...原创 2020-04-20 10:34:09 · 293 阅读 · 0 评论 -
NDK--Linux系统下利用bsdiff生成差分文件及安卓应用中合并差分文件实现增量更新...
上次说到微软windows平台下bsdiff的运用,而我们服务器一般都是linux系统,今天来搭建自己的服务器,并且在linux平台下增量更新的文件差分操作;最后在安卓应用中下载服务器差分文件,将旧APK和差分文件合并,实现增量更新1.环境配置首先需要有一个linux服务器,我这边使用的是一个装载了CentOS的虚拟机,所以后续操作都需要在同一个网络下面。环境配置分为2步:1:安装JDK 2...原创 2020-04-23 19:15:50 · 217 阅读 · 0 评论 -
NDK--so插件化原理,hook技术实现andfix热修复
1 .首先介绍so插件化原理,也就是hook,先研究一个问题:当我们知道so库中的函数名和参数时,如何调用so中的函数?我们在linux系统下新建一个c文件如下:sum.cint sum(int a,int b){ return a+b;}使用gcc编译成一个动态链接库gcc -fPIC -shared -o sum.so sum.c再新建一个c文件,用来调用so库中的函数,现在...原创 2020-05-04 13:44:05 · 304 阅读 · 0 评论 -
NDK--andfix热修复之art虚拟机
在so插件化原理,hook技术实现andfix热修复中,只实现了dalvik虚拟机中的热修复,安卓5.0后,谷歌彻底抛弃dalvik虚拟机,改用art虚拟机。在dalvik虚拟机中,应用启动首先会加载dex成class字节码,然后采用JIT技术,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码(CPU真正识别二进制),虽然转换时会利用缓存技术优化,但还是会造成应用运行...原创 2020-05-05 16:47:03 · 163 阅读 · 0 评论 -
NDK--app卸载监听
当我们app被卸载,一些流氓软件还能够在后台做操作,对于root过的手机,甚至可以重新安装回来,今天介绍一种在没有root过的手机中监听自身app被卸载的方法。核心思路:当app被卸载,相应的进程也被中断,无论是广播还是线程,都将不复存在。但我们可以开启一个进程,不断监听文件夹变化。当app被安装时,会在/data/data/目录下新建相应包名的文件夹,而java中有一个工具类:FileObse...原创 2020-05-19 11:44:28 · 185 阅读 · 0 评论 -
NDK--双进程守护之利用线程轮询实现APP保活
对于开发者而言,始终希望自己的应用能够一直运行着,然而因用户操作,系统回收等原因,app很容易被杀死。目前保活的方法如下:1.提高优先级这个办法对普通应用而言,应该只是降低了应用被杀死的概率,但是如果真的被系统回收了,还是无法让应用自动重新启动!2 让service.onStartCommand返回START_STICKYSTART_STICKY是service被kill掉后自动重启通...原创 2020-05-20 11:10:19 · 246 阅读 · 0 评论 -
NDK--实现gif图片播放
GIF是由CompuServe公司所推出的一种图形文件格式,安卓系统控件并不支持gif图片,如果将一个gif图片设置到ImageView上,它只会播放第一帧在Java层可以利用创建Movie实例,绘制每一帧图片来达到Gif动态效果。问题点:部分Gif图片不能自适应大小,播放速度比实际播放速度快,如果要显示的gif过大,还会出现OOM的问题。Glide框架对gif的支持是利用GifHel...原创 2020-05-22 16:30:44 · 191 阅读 · 0 评论 -
makefile基本使用
在linux和unix中,有一个强大的实用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件。make程序需要一个编译规则说明文件,称为makefile,makefile文件中描述了整个软件工程的编译规则和各个文件之间的依赖关系。makefile就像是一个shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个mak...原创 2020-05-27 09:58:10 · 87 阅读 · 0 评论 -
cmake基本使用
为什么要用cmake?makefile的语法非常复杂,光文档就有200多页,使用起来不方便,只支持linux平台,而cmake语法只有几页,用法通俗易懂,上手简单,代码量少,跨平台。这也是大多数人使用cmake的原因cmake默认使用CMakeLists.txt文件作为编写脚本的文件,下面编写了一个简单的CMakeLists.txt#1.cmake verson,指定cmake版本 cmak...原创 2020-06-04 10:13:48 · 56 阅读 · 0 评论 -
Linux系统下编译FFmpeg生成arm平台下动态连接库
FFmpeg为开源音视频编解码库,市面上的播放器很多都是基于FFmpeg开发的,可以说学会了FFmpeg,音视频开发的所有功能都可以实现。FFmpeg使用c语言编写,makefile工具编译,因此选择在linux平台下编译。而我们需要生成arm平台下的so库,需要使用到ndk1.ndk下载和安装https://developer.android.google.cn/ndk/downloads...原创 2020-06-19 17:05:16 · 264 阅读 · 0 评论 -
NDK--Android Studio中配置FFmpeg动态链接库
上次将FFmpeg通过linux系统编译成了arm平台下的动态链接库,生成了一个文件夹:其中include存放着头文件,lib存放着so库,今天将这些内容导入AS中,用于接下来音视频的开发。1.首先新建ndk工程,并在工程的main文件夹中新建jniLibs文件夹(AS默认的so库存放路径),并将上图中的文件夹复制到jniLibs文件夹下armeabi中存放so库...原创 2020-06-22 16:22:57 · 93 阅读 · 0 评论 -
NDK--利用FFmpeg进行视频解码
对于普通人而言,视频文件有许多格式,如mp4,rmvb,avi等,这存在的一个误区,让人们谈到视频就想到这些文件格式,而在音视频开发中,我们把这些文件格式称为封装格式,这些封装格式中,不仅仅包含着视频流,还包含着音频流,字幕流等,而视频流都按照视频编码标准进行编码,下面是视频编码标准名称 推出机构 推出时间 目前使用领域HEVC(H.265) MPEG/ITU-T 2013 ...原创 2020-06-28 16:09:33 · 129 阅读 · 0 评论 -
NDK--利用FFmpeg进行安卓原生绘制播放
上次说到视频编码和转码,得到了yuv格式的文件,我们平常看到的视频画面实际都是yuv格式,今天来实现在APP中播放视频,代码和上次差不多,只需将转码文件换成输出到屏幕上1.自定义View继承SurfaceView,把SurfaceView传入native层进行绘制package com.aruba.ffmpegapplication;import android.content.Conte...原创 2020-06-30 17:42:39 · 115 阅读 · 0 评论 -
NDK--利用FFmpeg进行音频解码
通过之前的知识,我们能够播放一个视频文件中的视频流,那么如何播放音频流呢?首先来了解一下关于音频的基础知识在物理学中,声音就是一种波,我们称之为声波,声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。数字音频:在早期声音无法捕获和保存,后面人们发明了模拟信号,将模拟信号数字化,我们称之为数字音频,在我们日常生活中,听歌,电视中的声音等都是数字音频。将模拟信号数字...原创 2020-07-01 17:28:51 · 566 阅读 · 0 评论 -
NDK--利用AudioTrack播放FFmpeg解码后的音频流
上次已经得到PCM编码的音频流,今天来实现播放PCM音频流,使用安卓提供的AudioTrack,方法很简单,在native层调用java代码首先在java中定义相应的方法:package com.aruba.ffmpegapplication;import android.media.AudioFormat;import android.media.AudioManager;impor...原创 2020-07-02 16:17:14 · 203 阅读 · 0 评论 -
NDK--利用OpenSL ES实现播放FFmpeg解码后的音频流
OpenSL ES全称为Open Sound Library for Embedded Systems。OpenSL ES是无授权费、跨平台、针对嵌入式系统 精心优化的硬件音频加速API。当然安卓也使用了它,AudioTrack、MediaPlayer的音频播放,底层都是利用OpenSL。和AudioTrack相同,它只接受流,不支持音频数据的编解码,所以需要结合第三方库来使用。为什么要使用Op...原创 2020-07-09 23:12:35 · 210 阅读 · 0 评论 -
NDK--音视频同步实现原生播放流媒体
之前实现了FFmpeg解码视频流并原生绘制到屏幕上以及解码音频流并利用OpenSL进行音频播放,今天来将两者联合使用,实现真正的视频播放。思路:如果想要顺畅的播放视频,很显然视频流和音频流需要同时进行播放,即两个线程分别播放视频流和音频流,而解码需要放一个单独线程中作为生产者,不断为视频线程和音频线程提供每一帧的数据,按照这个思路,我们开始编写相应代码1.首先需要一个线程不断读取每一帧数据自...原创 2020-11-12 18:00:03 · 194 阅读 · 0 评论 -
Nginx流媒体服务器搭建
说到流媒体服务器,首先想到的就是Nginx,原因是Nginx强大的性能和高并发量,它是由C语言从头写成,由于Nginx的优势和流媒体服务器的需求相匹配,很多流媒体服务器都使用的是Nginx对于移动端音视频开发,我们对服务器并不需要那么关心,但服务器是必不可少的,直播推流就需要用到服务器,正所谓技多不压身,学习如何搭建流媒体服务器对音视频开发有很大的帮助一.Nginx的搭建需要下载3个资源1....原创 2020-12-18 10:49:16 · 188 阅读 · 0 评论 -
NDK--Android Studio中直播推流框架的搭建
上次我们搭建了nginx流媒体服务器,接下来就是研究安卓端是如何直播推流到nginx服务器,之前我们了解到视频流和音频流,那么直播也必然绕不开这两个流,手机端的直播可想而知,视频流使用摄像头获取,音频流使用麦克风获取。然而摄像头和麦克风直接获取的裸数据的体积实在是太大了,如果要想进行网络传输,必须进行压缩,即编码一、视频编码:使用h264h264是目前使用最广泛的视频编码,由于高压缩比、高图像...原创 2020-12-29 15:16:48 · 256 阅读 · 0 评论 -
NDK--利用Camera和AudioRecord实现直播推流
上次我们在Android Studio中新建了项目,集成了实现直播推流所需要的工具,分别是:rtmpdump:推流x264:视频编码faac:音频编码文章地址:NDK--Android Studio中直播推流框架的搭建直播推流还需要流媒体服务器支持,我这边使用的是虚拟机,有条件的也可以使用真正的服务器,具体的流媒体服务器搭建方法可以参考我以前的文章:Nginx流媒体服务器搭建基...原创 2021-04-01 22:22:19 · 514 阅读 · 0 评论 -
WebRTC--从编译到部署,打造点对点音视频通话服务器
简单介绍WebRTC实现了基于网页的视频会议,是一个支持网页浏览器进行实时语音对话或视频对话的API(来自百度),由google开发,并于2011年6月3日开源。和直播推流不同,这是点对点通讯,服务器只是帮助建立连接,以满足视频通话的低延迟要求分为三个服务器:1.房间服务器:创建房间,让用户可以在一个房间内通讯2.信令服务器:用于用户交换信令,建立连接,类似TCP握手3.IC...原创 2021-07-09 22:33:14 · 1201 阅读 · 0 评论