使用Android-ndk编译安卓可执行程序

安卓系统本质上是一个基于linux内核的系统,所以是可以运行C、C++程序。

1、下载android-ndk开发包

​ 选择合适的自己想要的ndk版本,本文采用android-ndk-r21e,页面找不到对应的版本就去网页底部的不受支持的旧版本处下载对应的版本。

Platform Package Size (bytes) SHA1 Checksum
Linux android-ndk-r21e-linux-x86_64.zip 1190670072 c3ebc83c96a4d7f539bd72c241b2be9dcd29bda9

2、解压开发包压缩文件

unzip android-ndk-r21e-linux-x86_64.zip

3、安装开发环境

方法一:键入命令

cd android-ndk-r21e/build/tools
./make-standalone-toolchain.sh --platform=android-30 --install-dir=$install_dir  --toolchain=aarch64-linux-android-4.9 --arch=arm64

方法二:shell脚本

#本脚本用ndk编译android linux系统交叉编译工具链
DIR="$( cd "$( dirname "${
       
       BASH_SOURCE[0]}" )" && pwd )"
echo "DIR: $DIR"
install_dir=$DIR/android-30-toolchain/
echo "install_dir: $install_dir"
ndk_dir=$DIR/android-ndk-r21e
echo "ndk_dir: $ndk_dir"
cd $ndk_dir/build/tools
./make-standalone-toolchain.sh --platform=android-30 --install-dir=$install_dir  --toolchain=aarch64-linux-android-4.9 --arch=arm64

4、添加环境变量

采用shell脚本来执行,每次需要用到该环境变量执行一次脚本就可以,不用每次都手动敲很多命令。

//示例代码,不能直接用
cur_dir=$PWD
dev_dir="$( cd "$( dirname "${
       
       BASH_SOURCE[0]}" )" && pwd )"
cd $dev_dir

ANDROID_NDK_ROOT=$dev_dir/android-ndk-r21e
export ANDROID_NDK_ROOT

arch=aarch64
host=aarch64-linux
cross_compiler=aarch64-linux-android-
export arch cross_compiler host

TOOLCHAIN_DIR=$dev_dir/android-21-toolchain
cd $TOOLCHAIN_DIR

COMPILER_PATH=${TOOLCHAIN_DIR}/bin

CC=${cross_compiler}gcc
CXX=${cross_compiler}g++
RANLIB=${cross_compiler}ranlib
STRIP=${cross_compiler}strip
LD=${cross_compiler}ld
GDB=${cross_compiler}gdb

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$TOOLCHAIN_DIR:$COMPILER_PATH:$ANDROID_NDK_ROOT"
export PATH

export CC CXX RANLIB STRIP LD

rootfs_dir=$TOOLCHAIN_DIR/sysroot
kernel_ver_info_file=$TOOLCHAIN_DIR/kernel_ver.info
rootfs_ver_info_file=$TOOLCHAIN_DIR/rootfs_ver.info

export rootfs_dir rootfs_ver_info_file kernel_ver_info_file

SYSROOT=$rootfs_dir
export SYSROOT

cd $cur_dir

5、编译C/C++代码
5.1.编写测试代码
编写测试代码test.cpp

#include <iostream>
using namespace std;
int main() {
	cout << "hello Android!" << endl;
	return 0
}

5.2.生成可执行程序
在Android 4.4之后添加了新的保护机制,可执行文件必须是采用PIE编译的。
编译时添加-pie -fPIE

export PATH=~/ndktest/ndk/bin/:$PATH
aarch64-linux-android-g++ test.cpp -o test -pie -fPIE

5.3.运行C/C++程序
将生成好的可执行程序上传至安卓设备.
可通过file命令查看可执行文件类型

file a.out
a.out: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/linker64, with debug_info, not stripped

猜你喜欢

转载自blog.csdn.net/sinat_36002055/article/details/125205310
今日推荐