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是臨時環境變量,關閉命令行後失效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章