NDK16_Linux中使用NDK编译安卓可用的.c

NDK开发汇总

一 ubuntu中编译c文件

  • vim main.c
    编辑
int main(){
	printf("111\n");
	return 0;
}
  • gcc main.c 将生成a.out文件

  • vi mian.c 添加头文件

#include <stdio.h>
  • gcc -o main main.c
    生成一个可执行文件main
  • 执行./main
    打印结果:11111
    这个main文件在Android手机中不能执行,这是因为两个设备不同,对应的指令集不同

想要在ubuntu中编译出在Android手机中可以执行的文件,需要下载NDK中对应的交叉编译工具

二 ubuntu配置NDK

1 下载 wget

找到ndk的官网下载地址,注意选Linux平台

wget ndk的url地址

2 配置临时环境变量

export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

3 编译main.c

 $CC main.c

<stdio.h>报错,

@ubuntu:~$ export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
bao@ubuntu:~$ $CC main.c
main.c:1:19: fatal error: stdio.h: No such file or directory
 #include <stdio.h>
                   ^
compilation terminated.

需要链接对应的头文件,涉及到链接头文件和库文件的配置

三 编译时配置

如果被编译的文件链接了其他头文件或者库文件,需要进行配置

类似 javac -classpath xxx

1 查找头文件

--sysroot=XX
    使用xx作为这一次编译的头文件与库文件的查找目录,查找下面的 usr/include 目录
-isysroot XX
    头文件查找目录,覆盖--sysroot ,查找 XX/usr/include
-isystem XX
    指定头文件查找路径(直接查找根目录)
-IXX
    头文件查找目录

优先级:
-I -> -isystem -> sysroot

gcc --sysroot=目录1 -isysroot 目录2 -isystem 目录3 -I目录4  main.c
查找 目录1/usr/lib 的库文件
目录2 /usr/include 的头文件	
还去查找 目录3 下的头文件
还去查找 目录4 下的头文件

2 查找库头文件

-LXX
指定库文件查找目录
-lxx.so
指定需要链接的库名

gcc -L目录1 -l库名

例子: 链接ndk的日志库

gcc -LC:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\platforms\android-21\arch-arm\usr\lib
-llog  -lGLESv2

还可以

gcc --sysroot=C:\Users\Administrator\AppData\Local\Android\Sdk\ndk-bundle\platforms\android-21\arch-arm
-llog -lGLESv2

四 使用NDK的gcc和.h编译main.c

export CC=android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

export AAA="--sysroot=/home/bao/android-ndk-r17c/platforms/android-21/arch-arm -isystem /home/bao/android-ndk-r17c/sysroot/usr/include -isystem /home/bao/android-ndk-r17c/sysroot/usr/include/arm-linux-androideabi"

$CC $AAA -pie main.c -o main

生成main,用file查看,发现是ARM架构

bao@ubuntu:~$ file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, not stripped

将main文件放到具有root权限的手机中./main执行,能够输出:111,这样就编译生成了一个Android可用的可执行文件

五 注意

  • NDK的版本用17的,不能太新,否则没有gcc;选择Linux平台
  • 注意上述命令的地址根目录,要替换成你的ndk所在根目录

/home/bao 改成你的ndk所在路径

  • 为了再Android手机中能够执行main,编译必须加上pie
  • export是临时环境变量,关闭命令行后失效

猜你喜欢

转载自blog.csdn.net/baopengjian/article/details/106617586