NDK
文章平均质量分 87
氦客
Stay hungry,Stay foolish
展开
-
Android NDK CMakeLists.txt 常用命令说明
Android NDK 开发 CMakeLists.txt 常用命令说明原创 2022-08-29 06:30:00 · 831 阅读 · 0 评论 -
Ubuntu 编译 哔哩哔哩 IJKPlayer so库,并支持RTSP
使用Ubuntu 18.04.4 编译 IJKPLayer,同时配置RTSP原创 2022-06-20 06:30:00 · 999 阅读 · 7 评论 -
Android NDK 打印日志到Logcat
首先确保CmakeLists中已添加Log库通过Android Studio 新建NDK项目后,需要确保CmakeLists.txt已添加Log库# 从系统库中查找依赖库find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK lib...原创 2019-12-06 18:02:19 · 768 阅读 · 0 评论 -
C++ 单例模式
新建SingleTon.hclass SingleTon{private: static SingleTon* instance; SingleTon();public: static SingleTon* getInstance();};新建SingleTon.cpp#include "SingleTon.h"SingleTon* SingleTon::instance ...原创 2019-05-22 07:32:51 · 204 阅读 · 0 评论 -
C++ 类型转换、异常处理、命名空间
类型转换C++ 支持4中类型转换操作符来应对不同场合的应用const_cast,字面上理解就是去const属性static_cast,静态类型转换,如int转换成chardynamic_cast,动态类型转换,如子类和父类之间的多态类型转换reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换4中类型转换的格式,如 TYPE B = static_cast(T...原创 2019-05-21 08:00:10 · 220 阅读 · 0 评论 -
NDK-动态库和静态库
库的概念在Window平台和Linux平台下都大量存在着库。Android中也存在库,库顾名思义,指的是一个容器文件,里面装的是函数,由于windows和linux的平台不同 (主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。库存在的意义库是别人写好的现有的,成熟的,可以复用的代码,和jar包是一个道理库的种类:动态库和静态库动态库: .so/.dll (linux...原创 2019-05-15 08:18:39 · 433 阅读 · 0 评论 -
C语言-共用体
共用体共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。用来降低 内存开销union Data{ int i; float f; char str[20];}data; 共用体的内存大小共用体中占用内存最大的成员决定...原创 2019-05-15 07:57:55 · 224 阅读 · 0 评论 -
C语言-指针数组和指针数组
指针数组本质是数组只不过呢,它里面存放的数据类型不是int,也不是char这类基本类型,而是一个指针类型,说白了就是地址,所以叫指针数组! 记住:是存放指针的数组!数组指针 (行指针)本质是指针只不过是指向一个数组的指针,也称之为“行指针”int (*p)[n] p是一个指针,指向一个int类型的一位数组,这个一位数组的长度是n。也就是说执行p+1时,p要跨过n个int类型数...原创 2019-05-15 07:29:33 · 241 阅读 · 0 评论 -
C++ 容器
C++ 有序列式与关联式容器序列式容器元素排列顺序与元素本身无关,由添加顺序决定,比如vector、list、dequeue、queue、stack、priority queue以vector为例vector<int> vec_1;//声明一个元素空间vector<int> vec_2(1);//6个元素 值都是1vector<int> vec_...原创 2019-05-22 07:39:24 · 271 阅读 · 0 评论 -
C++ 操作符重载
可以重定义或重载大部分 C++ 内置的运算符。这样,就能使用自定义类型的运算符。现在类中定义一个操作符重载class Test3{public: int i; Test3 operator+(const Test3& t){ Test3 temp; temp.i = this->i + t.i; return temp; }}; 然后进行使用vo...原创 2019-05-22 07:41:03 · 378 阅读 · 0 评论 -
shell - 基础使用
shell对Android有什么用能独立编译任意的第三方库,并将它打包到APK中最简单的使用新建一个sh文件vim demo.sh第一行都是以如下开始,相当于java文件第一行为包名的声明#! /bin/bash 输出一句话echo ""hello world!" 给予sh文件权限chmod 777 demo.sh执行sh文件./demo.sh #二选一/bi...原创 2019-05-23 07:50:32 · 255 阅读 · 0 评论 -
shell - for循环、while循环、压缩文件、读文件
for循环最简单的for循环#!/bin/bashfor i in $(seq 1 9)do echo "数字 $i"done 可以看到打印的结果数字 1数字 2数字 3数字 4数字 5数字 6数字 7数字 8数字 9求和#!/bin/bashj=0for((i=0;i<=100;i++))do j=`expr $i + $...原创 2019-05-23 07:46:49 · 1785 阅读 · 0 评论 -
shell- if语句、运算符
if语句if(表达式);then 语句else 语句fi比如#!/bin/bashNUM1=100NUM2=200if(($NUM1>$NUM2));then echo "num1>num2"else echo "num1<num2"fi注意:if()后面不需要{},只需要;语句一定要有tab键输入,不能是空格。空格...原创 2019-05-23 08:06:06 · 380 阅读 · 0 评论 -
shell - 重定向、方法参数传递机制、返回值
重定向输入重定向>输出重定向<函数第一种name(){ command; command2;}第二种[ function ] funname [{}]{ action; [return int;]}比如#!/bin/bashfunction test(){ c="this is c" d="this is d"...原创 2019-05-24 07:01:34 · 1298 阅读 · 0 评论 -
Android NDK - 使用Visual Studio进行CMake C++开发
为什么要使用Visual Studio可以方便在电脑上进行调试一般大型的NDK项目,都是现在VS上调试好,再移植到Android Studio中可以实时看到效果和Android Studio环境类似,移植方便C++游戏开发大多都是用Visual Studio安装首先,进入官网下载社区免费版在安装引导页面选择使用C++的桌面开发和使用C++的Linux开发点击安装,...原创 2019-05-24 07:16:55 · 2162 阅读 · 0 评论 -
CMake语法详解
什么是CMakeAS2.2以上,构建原始库的默认工具是CmakeCMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake并不直接构建最终的软件,而是产生其他工具的脚本(如makefile)注释单行注释 #XXXXX多行注释 #[[XXXXXXX]]变量CMake中所有的变量都是string类型。可以使用set()和unset()命令来声明...原创 2019-05-24 08:30:42 · 1138 阅读 · 0 评论 -
Visual Studio 2019 cmake配置opencv开发环境
开发OpenCV,一般通过Visual Studio 进行开发调试,再移植到Android Studio 中。下文使用的是Visual Studio 2019下载SDKopencv下载这里我们需要下载Windows的下载完成后后,将opencv-4.1.0-vc14_vc15.exe安装到电脑中打开Visual Studio,新建CMake项目在项目内(和cpp同级)的CMake...原创 2019-06-25 07:11:16 · 7256 阅读 · 6 评论 -
C++ 类模板、函数模板
函数模板函数模板相当于java中的泛型方法template <typename T>T test5(T i, T j){ return i > j ? i : j;}void main(){ double f = test5(13.2, 15.3); cout << f << endl;}打印结果为15.3类模板类模板相当于ja...原创 2019-05-20 09:06:37 · 537 阅读 · 0 评论 -
C++ 继承、多态、虚函数
继承C++支持多继承class Parent {}class Parent2{};class Child : public Parent, private Parent2 {} 公有继承和私有继承的区别public Parent:公有继承,private和public都会继承private Parent:私有继承,只继承private的多态静态多态和动态多态cla...原创 2019-05-20 08:55:49 · 241 阅读 · 0 评论 -
Android FFmpeg视频转码并保存到本地
本文讲述在Android中, 如何将FFmpeg视频转码为YUV格式并保存到本地。首先,我们基于上一篇文章 基于Android Studio3.2实现ffmpeg最简单的例子 来进行配置。配置好之后,我们先来明确下概念,FFmpeg解码的流程是固定的av_register_all: 注册所有组件avformat_open_input : 打开输入视频文件avformat_find_st...原创 2018-10-27 16:40:47 · 3674 阅读 · 0 评论 -
JNI相关
JNI是什么即Java Native Interface,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。 可以简单地理解为Java调用C/C++,C/C++调用Java的一套API。 C的函数名规则Java_完整类名_函数名JNIEnv是一个结构体指针 代表Java的运行环境,调用Java中的代码 JNIEnv * 在C语言中是一个...原创 2018-03-14 07:29:10 · 279 阅读 · 0 评论 -
C语言-结构体
结构体是什么 ?结构体是一种构造数据类型,把不同的数据类型整合起来成为一个自定义的数据类型 类似于Java中的类写法1struct Man{ char* name; int age; char nationality[50]; int(*func)();};void main(){ //初始化结构体变量 //形式1 只能在变量...原创 2018-03-14 07:08:14 · 297 阅读 · 0 评论 -
C语言-字符数组、联合体、typedef
字符数组char a[10] = "Happy";//字符串数组赋值,只能在声明时//a = "";//可以修改单个内容a[0] = "F";//重新赋值strcpy(a, "Sad");getchar(); 联合体(共用体)不同类型的变量共同占用一段内存(相互覆盖),联合体变量任何时刻只有一个成员存在,节省内存 联合体变量的大小 = 最大的成员所占的字节数原创 2018-01-29 07:46:40 · 823 阅读 · 0 评论 -
C语言-IO
fopen()C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。 FILE *fopen(const char *filename, const char *mode) 详见 传送门fputs()C 库函数 int fputs(cons原创 2018-01-26 07:40:37 · 1171 阅读 · 0 评论 -
C语言-预编译
C语言执行的流程预编译(预处理)阶段:这个就是那些#include什么的,为编译做准备工作,完成代码文本的替换工作 编译阶段:把C语言的代码转成汇编语言代码,比如 int a = 2; 它会生成mov a, 2; 汇编阶断:把汇编代码转换成机器码,比如把mov a , 2 ; 转成 cd07 (mov指令的机器码中的一种机器码) 链接阶断:制作成一个可执行文件,比如windows是PE的原创 2018-01-25 07:27:23 · 936 阅读 · 0 评论 -
C语言-内存分配
静态内存分配分配内存在栈中,如果超出分配内存的大小,会报stack overflow错误。 int a[1024 * 1024 * 10]; C语言的内存区域1.栈区(statck),windows下,栈内存分配确定的常数,超出了限制,就会提示stack overflow错误。栈内存自动分配,释放。 2.堆区(heap) 程序员手动分配和释放,可以分配操作系统大概80原创 2018-01-24 07:32:43 · 596 阅读 · 0 评论 -
C语言-多级指针
多级指针指针保存的是变量的地址,保存的这个变量可以是一个指针变量。 **表示二级指针,***表示三级指针,以此类推。 int a = 50;//p1上保存的a的地址int*p1= &a;//p2上保存的p1的地址int** p2 = &p1; //二级指针//p3上保存的p2的地址//int*** p3 = &p2; //三级指针 二级指针二级指针上保存的是一级指针的地址。*p2原创 2017-11-28 07:43:24 · 431 阅读 · 0 评论 -
C语言 - 指针
什么是指针指针存储的是变量的内存地址。 申明指针的方式通过类型*进行声明,比如 int *ip; /* 一个整型的指针 */double *dp; /* 一个 double 型的指针 */float *fp; /* 一个浮点型的指针 */char *ch; /* 一个字符型的指针 */ 无论哪种类型指针的实际数据,都是一个代表内存地址长的十六进制原创 2017-11-22 07:34:36 · 504 阅读 · 0 评论 -
使用Android Studio3.0 进行NDK开发
首先,我们使用Android Studio3.0新建一个项目,并勾选Include C++ support 接着,直接Next、Next,来到Customize C++ Support界面。 这里需要说明一下 C++ Standard : 希望使用哪种C++标准,一般情况下,选择默认即可。 Exceptions Support(-fexceptions): 是否启用对 C+...原创 2018-04-10 06:32:24 · 2471 阅读 · 3 评论 -
Android Studio3.0,在原有项目中进行ndk配置
在Android Studio 3.0的IDE环境下,对原有项目,进行ndk配置。首先配置app目录下的gradle android { defaultConfig { applicationId "com.heiko.ndkbaby" //... externalNativeBuild { cmake {...原创 2018-04-17 20:43:44 · 693 阅读 · 0 评论 -
C++ 宏定义、布尔类型、三元表达式
宏定义用一个标识来代替一个字符串#define PI 3.14 void main(){ double radius = 5.3; double area = PI * radius * radius; cout &lt;&lt; "圆的面积:" &lt;&lt; area &lt;&lt; endl;}注意: 由于宏定义只是用宏原创 2018-09-18 20:05:05 · 1441 阅读 · 0 评论 -
基于Android Studio3.2实现ffmpeg最简单的例子
依赖关系看 configure 文件 的 libraries 选项原创 2018-10-23 02:03:27 · 1277 阅读 · 0 评论 -
Visual Studio FFmpeg配置
在vs中,创建一个新项目,下载ffmpeg-20180201-b1af0e2-win64-dev,解压复制include和lib到vs项目的源码级别文件夹接着,下载ffmpeg-20180201-b1af0e2-win64-shared复制所有.dll文件到vs项目的源码级别文件夹,如下图所示接着,在vs项目中进行配置在C/C++的常规选项的附加包含目录中,添加include文件夹...原创 2018-10-04 06:54:39 · 792 阅读 · 0 评论 -
FFmpeg下载及命令行使用
下载地址访问FFmpeg官网选择Dlownload选择 Windows Package选择相应版本点击进行下载,并进行解压,可得到如下几个文件版本说明Static: 只包含了3个体积很大的exeShared:除了体积很小的exe以外,还包含了dll动态库文件Dev:只包含了开发用的头文件(.h)和导入库文件(.lib)ffmpeg.exe命令说明转换视频,将inp...原创 2018-10-04 06:01:10 · 21710 阅读 · 4 评论 -
音视频基础知识
音视频基础知识录像、录音,实质是一个压缩采集的图像或视频数据的过程(编码),就会有各种各样的格式。播放视频或音频文件,实质上是一个解压缩的过程(解码)视频文件后缀名是FLV,MKV,MP4等 ,都是封装格式的数据然后解封装接着获取 音频压缩数据 和 视频压缩数据音频压缩数据 解码 获得 音频采样数据(PCM),视频压缩数据 解码 获得 视频像素数据(YUV)采样率采样率:44...原创 2018-09-30 21:32:02 · 2979 阅读 · 0 评论 -
C++指针和引用
引用是内存空间另外一个别名,相当于门牌号,可以用它来找到具体的内存空间。int &amp;b = a;cout &lt;&lt; b &lt;&lt; endl;引用和指针的区别指针是一个实体,而引用仅是个别名;引用使用时无需解引用(*),指针需要解引用;引用只能在定义时被初始化一次,之后不可变;指针可变;引用没有 const,指针有 const,const 的指针不可变;引...原创 2018-09-19 19:40:10 · 250 阅读 · 0 评论 -
C++ 命名空间
C++ 日志打印std::cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Hello world!&amp;quot; &amp;amp;lt;&amp;amp;lt; std::endl;命名空间类似于Java中的包,解决重名的问题。标准明明空间C++标准程序库中的所有标识符都被定义于一个名为std(standard)的namespace中using原创 2018-09-18 19:58:18 · 201 阅读 · 0 评论 -
Android Studio NDK 如何生成so
Android Studio NDK 如何生成so先来看下代码 MyNdkUtil.java package com.heiko.ndksotest;public class MyTestNdk { static { System.loadLibrary(&quot;native-lib&quot;); } public native String strin...原创 2018-08-19 09:42:45 · 1428 阅读 · 0 评论 -
C语言-函数指针
函数指针函数指针是指向函数的指针变量。 函数指针本身首先应该是指针变量,只不过该指针变量指向函数。 C在编译的时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他变量一样。用途: 调用函数和做函数的参数 函数指针的使用其中void代表函数的返回值,fun_p:函数指针的名称,char* msg,原创 2017-11-30 07:35:11 · 676 阅读 · 0 评论