NDK学习之路-Linux基础篇
前言
一、基本命令集
下面是 文件权限
vim/vi编辑
Linux 权限:
防火墙:
二、编译的原理
三、拉流
四、编译器配置(交叉编译重要参数)
总结
前言
Android底层是Linux学习Linux相关命令及操作是必须的
一、基本命令集
- 下载: wget 下载链接
wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip?hl=zh_cn
解压:unzip android-ndk-r17c.zip
-
下面是 文件权限
-rw-r--r-- 1 root root 31 Jan 3 20:58 test.txt
- 文件
d 代表文件夹 目录-
rw- 1.当前自身所在用户的权限
r-- 2.代表同组的权限
r-- 3.其他用户的权限r 可以读
w 可以写
x 可执行
chmod 777 test.txt 最高权限的配置
-rwxrwxrwx 1 root root 31 Jan 3 20:58 test.txtchmod 477 test.txt
4 可读 2 可写 1可执行
chmod 111 test.txt
chmod +x test.txt 给三组都分配了,可执行权限
chmod u=r test.txt 当前所在用户 给一个 读的权限
chmod u=r,g=r,o=r test.txt 给三组都分配了读的权限
-
vim/vi编辑
一进入VIM编辑器的是,默认是命令模式
i 编辑的意思
a 追加的意思
:w 就是保存的意思
:q 退出的意思
:q! 强制退出,不管有没有保存
set number 显示行号
/ 搜索注意点:1.不小心按到 Ctrl + S / Ctrl + 其他 会出现 死机的现象
2.不要操作小键盘命令模式下:
1.gg:跳转到最上面
2.G:跳转到最下面
3.k:上一行
4.j:下一行
5.h:左边, l:右边 -
基本命令参解
* TODO Linux命令使用* mkdir 目录名称(创建一个文件夹)** Linux的环境变量:* 临时环境变量:连接到Linux服务器,会产生一个回话,那么我们配置的临时环境变量就保存在这个回合中,如果关闭了,临时环境就没有了* export:代表声明一个环境变量,声明的过程中,内容是以:隔开的,Windows是以;隔开的* 声明:export CLASSPATH=KevinStudy:NDK:XShell* 查看:echo $CLASSPATH* 查看电脑环境变量:echo $PATH (类似于 Windows中的 path 一样哦)** 永久环境变量:* export PATH=${PATH}:xxxxx (代表是 在PATH这个环境变量的基础上 增加: xxxxx环境变量的配置)* 三个重要的文件:profile,bashrc,bash_profile* cat /etc/profile (代表是 输出 profile文件的内容)* ~ 代表当前用户,相当于Windows下的C:\Users\Administrator* etc:代表的是全局环境变量的设定, ~/是用户私有环境变量的设定* 刷新修改的 环境变量文件 命令是:source /etc/profile** vim(:q!代表不保存,退出到命令行, :wq代表保存,退出到命令行)*
-
Linux 权限:
* TODO Linux 权限** 查看当前用户命令:whoami* 查看当前分组命令:groups** -代表文件* d代码目录 dir 的意思** 第一组(3个):代表是当前所在用户的权限,也就是自己本身的权限* 第二组(3个):代表同组的权限* 第三组(3个):代表其他用户的权限** 查看共有那些用户:cat /etc/passwd** vim test.txt 编写内容 按esc键,再输入:wq* 查看此文件所属的组:groups test.txt** 发现此文件是所属 root用户 root组 ,然后可以修改用户/组的权限,命令是:chown ntp:ntp test.txt** 修改test.txt的权限:* 1.切换用户,su ntp* 2.还原当前用户,su* 3.修改权限:chmod 177 test.txt,不可读不可写了** 修改权限细节:例如:给此文件分配最高权限 可读 可写 可执行 并且是三组都是这样 chmod 777 test.txt* 1.使用数字修改权限:(r 可读 4),(w 可写 2),(x 可执行 1)* chmod 477 test.txt: 第一组 可读/不可写/不可执行, 后面两组:可读/可写/可执行* 可以任意组合数字,来完成权限* 2.使用标识修改权限:(+x 可执行)(+r 可读)(+w 可写)* chmod +x test.txt , chmod +r test.txt chmod +w test.txt 修改的是当前用户这一组* chmod u=r,g=wr,o=r test.txt 同时给三组 添加权限 user,group,other* 修改文件夹里面所有的文件权限:chmod -R 777 Test01/*
-
防火墙:
* TODO 防火墙:防火墙是为了保护我们的计算机的,是为了提高安全性* 安装iptables防火墙:yum/apt install iptables* 查看配置:iptables -nL* Chain INPUT (policy ACCEPT) 输入 允许的, 如果是DROP 就是不允许的* target prot opt source destination** Chain FORWARD (policy ACCEPT) 转发 允许的* target prot opt source destination** Chain OUTPUT (policy ACCEPT) 输出 允许的* target prot opt source destination
二、编译的原理
编译(把人写的代码变成机器可以认识的指令) Linux(gcc),Mac(Clang)
1.预处理阶段(include,宏 ....)
gcc -E A.c -o A.i
2.编译阶段,编译之后(汇编代码)
gcc -S A.i -o A.s
3.汇编处理阶段,把汇编代码处理成,计算机认识01010101机器码
gcc -c A.s -o A.o
4.链接阶段,打出可以执行的
gcc -C A.o -o A
./A 执行
一条命令之前上面四个步骤: gcc B.c -o B
三、拉流
http://ffmpeg.org/download.html
D:\NDK\Utils\ffmpeg-20191226-b0d0d7e-win64-static\ffmpeg-20191226-b0d0d7e-win64-static\bin
配置到环节变量:path
rtmp流地址:
https://blog.csdn.net/XiaoYuWen1242466468/article/details/90287886
四、编译器配置(交叉编译重要参数)
vim /etc/profile
#这是操作的目录
export my_dir="/root/Zer0"
export NDK="$my_dir/android-ndk-r17c"
- NDK_GCC 编译器
export NDK_GCC_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"
export NDK_GCC_x64="$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc"
export NDK_GCC_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
export NDK_GCC_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
- NDK_CFIG 链接
export NDK_CFIG_x86="--sysroot=$NDK/platforms/android-21/arch-x86 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/i686-linux-android"
export NDK_CFIG_x64="--sysroot=$NDK/platforms/android-21/arch-x86_64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/x86_64-linux-android"
export NDK_CFIG_arm="--sysroot=$NDK/platforms/android-21/arch-arm -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
export NDK_CFIG_arm_64="--sysroot=$NDK/platforms/android-21/arch-arm64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/aarch64-linux-android"
- NDK_AR 编译静态库
export NDK_AR_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar"
export NDK_AR_x64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
export NDK_AR_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"
export NDK_AR_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
举个例子:arm手机(32位)编译成功的配置
- export NDK_gcc="/root/Zer0/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
//--sysroot=路径(自动寻找头文件和库文件 .a /.so )
// -isystem 路径 (自动寻找指定的头文件)
//如果同时设置 --sysroot=路径 -isystem 路径,最终达到的效果是(使用了前者的库文件,使用了后者的头文件)
- export NDK_CFIG ="--sysroot=/root/Zer0/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/Zer0/android-ndk-r17c/sysroot/usr/include"
以上配置还有一点小问题,asm无法引入,会报错,报错原因:C源码内部需要引入asm。需追加-isystem /root/Zer0/android- ndk-r17c/sysroot/usr/include/arm-linux-androideabi。如下:
- export NDK_CFIG ="--sysroot=/root/Zer0/android-ndk-r17c/platforms/android-21/arch-arm -isystem /root/Zer0/android-ndk-r17c/sysroot/usr/include -isystem /root/Zer0/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"
//不加 -pie在Android平台执行报错 提示【PIE】错误
- $NDK_gcc $NDK_CFIG -pie main.c -o main_ndk_exe
打包静态库:
NDK_AR rcs -o libadd.a add.o