Notes on Android native programming
on 技术笔记
1. Android adb shell执行程序
在一些开发板上,交叉编译的可执行程序可以在Android adb连接到的shell里直接运行。但是需要把可执行文件放在/dev文件夹下面,RK3399 Pro开发板上亲测可用 [Reference]。
$ adb push a.out /dev
$ adb shell
$ cd /dev
$ ./a.out
2. 使用cmake交叉编译找不到std的库函数
原因是cmake没有找到相应的std库,需要在执行cmake的时候加上-DANDROID_STL=c++_shared或者-DANDROID_STL=c++_static选项 [Reference]。
举例:cmake编译armv7的Android库,注意加了-DANDROID_STL=c++_static
cmake \
-DANDROID_ABI=armeabi-v7a \
-DANDROID_PLATFORM=android-21 \
-DANDROID_NDK=$Some_Path/android-ndk-r16b \
-DCMAKE_TOOLCHAIN_FILE=$Some_Path/android-ndk-r16b/build/cmake/android.toolchain.cmake \
-DBUILD_ANDROID=true \
-DBUILD_TESTING=true \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_STL=c++_static ..
关于ndk使用cmake编译的更多选项可以参考 link。
3. 出现undefined reference to ‘rand’等函数
rand函数应该是数学库里的,ndk应该会自动链接libm.so,出现这种情况很有可能是因为Andoid Platform跟之前其他依赖库选择的不一致 [Reference]。