首先记录一下C++中的NULL、0、nullptr的区别
NULL
在C++中就是0
,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr
,可以保证在任何情况下都代表空指针
,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。
交叉编译工具介绍
- CC:编译器,对C源文件进行编译处理,生成汇编文件。
- AS:将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)。
- AR:打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块。
- LD:链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件。
- GDB:调试工具,可以对运行过程中的程序进行代码调试工作。
- STRIP:以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。
- NM:查看静态库文件中的符号表。
使用ar
命令解压.a
文件
ar x libavcodec.a
![](https://img.haomeiwen.com/i6854876/0296ed332e045557.png)
**使用
nm
命令查看函数
和成员变量
参考https://blog.csdn.net/stpeace/article/details/47089585
nm libavcodec.a >aaa.txt
![](https://img.haomeiwen.com/i6854876/d7a1a597e24bfff4.png)
![](https://img.haomeiwen.com/i6854876/0ac459ff07839711.png)
CMake message输出位置
![](https://img.haomeiwen.com/i6854876/978f7f182dce90f8.png)
readelf命令
readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件
报错
has text relocations
增加编译选项
--disable-asm
编译成功
#!/bin/bash
API=29
ARCH=x86
PREFIX=./ABC
TOOLCHAIN=/home/guozengjie/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64
build()
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--disable-doc \
--disable-programs \
--disable-avdevice \
--enable-cross-compile \
--target-os=android \
--arch=$ARCH \
--pkg-config=/usr/bin/pkg-config \
--cc=$TOOLCHAIN/bin/i686-linux-android$API-clang \
--cross-prefix=$TOOLCHAIN/bin/i686-linux-android- \
--disable-asm
make clean
make
make install
}
build
导入AS
#设置头文件目录
include_directories(include)
#设置库文件目录
link_directories(../jniLibs/${ANDROID_ABI})
target_link_libraries( # Specifies the target library.
native-lib
avformat avcodec avfilter avutil swresample swscale
log
z)
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "x86"
}
}
函数指针
int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
void*
无类型指针
C++ 线程
Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,什么是POSIX线程(百度百科)POSIX线程库中有一系列Pthreads API方便我们对Linux线程的操作。
pthread_t pid;
void *run(void *) {
__android_log_print(ANDROID_LOG_ERROR, "TAG", "run");
pthread_exit(&pid);
}
pthread_create(&pid, nullptr, run, nullptr);
Notepad复制一行
方法主要是应用键盘上的
Home
键和End
键:鼠标光标停留在一行的某处, 按Home键光标会跳到行首,按End键光标会跳到行尾。鼠标光标停留在行首时,按Shift+End
就可以选中一行
__android_log_print 定义宏函数
#define loge(...) __android_log_print(ANDROID_LOG_ERROR, "FFmpeg", __VA_ARGS__)
-Werror,它要求GCC将所有的警告当成错误进行处理
adb logcat 乱码
参考https://www.cnblogs.com/jadyyummy/p/7543704.html
参考https://www.cnblogs.com/xy-ouyang/p/10688575.html
方法一:临时修改
- chcp 65001
- 命令行窗口标题栏右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console"
方法二:永久修改
![](https://img.haomeiwen.com/i6854876/e560be479b64b601.png)
![](https://img.haomeiwen.com/i6854876/8a3b9e3c70ff419c.png)
![](https://img.haomeiwen.com/i6854876/25e5d769cab893eb.png)
![](https://img.haomeiwen.com/i6854876/8b26d6975d2e6747.png)
NDK查看错误日志
参考https://blog.csdn.net/qq_33505109/article/details/105551017
adb logcat | ndk-stack -sym F:\AndroidProjects\CPlusPlus\app\build\intermediates\cmake\debug\obj\x86
linux中
>
表示覆盖原文件内容(文件的日期也会自动更新),>>
表示追加内容(会另起一行,文件的日期也会自动更新)。
顺序执行多条命令:command1;command2;command3;简单的顺序指令可以通过;
来实现
C++指针
参考https://www.cnblogs.com/aquester/p/11469872.html
F8 单步调试
F9 运行到下一个断点
性能优化工具Systrace
参考https://developer.android.com/topic/performance/tracing/command-line
参考https://blog.csdn.net/vicwudi/article/details/100191529
方法一:使用命令行模式
脚本文件位置F:\Sdk\platform-tools\systrace\systrace.py
![](https://img.haomeiwen.com/i6854876/33507ee9ae343d94.png)
如图所示,改脚本只支持python2.7,由于默认版本是
3.7
,所以我们要切换到python2.7
conda create -n python2 python=2.7
conda activate python2
报错ImportError: No module named win32con
,解决办法:
conda search win32
conda install pywin32
conda install six
环境已经配置好,然后执行脚本
python systrace.py -h
python systrace.py
方法二:使用开发者选项
参考https://developer.android.com/topic/performance/tracing/on-device
![](https://img.haomeiwen.com/i6854876/ebc9bb0e6f8900e4.png)
Systrace文件分析工具https://ui.perfetto.dev/#!/
C++不可以返回局部变量引用或指针?
参考https://blog.csdn.net/u010177010/article/details/50802787
参考https://blog.csdn.net/kai8wei/article/details/44699493
new 创建类对象,需要指针接受,使用堆空间;而局部不用new对象使用栈空间
网友评论