溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Android開(kāi)發(fā)實(shí)踐:Android交叉編譯工具鏈的使用

發(fā)布時(shí)間:2020-04-02 05:01:57 來(lái)源:網(wǎng)絡(luò) 閱讀:4453 作者:Jhuster 欄目:移動(dòng)開(kāi)發(fā)

前面2篇文章分別介紹了Android NDK編譯的命令行參數(shù),以及如何在任意目錄使用Android.mk來(lái)編譯本地c/c++代碼,Andriod.mk和ndk-build只不過(guò)是Android官方提供了一套封裝過(guò)的Android交叉編譯環(huán)境而已,其實(shí),你可以不用它,而直接通過(guò)傳統(tǒng)的Makefile文件來(lái)編譯你的c/c++代碼的,本文即介紹如何直接通過(guò)傳統(tǒng)的Makefile文件來(lái)編譯可用于Android平臺(tái)的庫(kù)文件。


經(jīng)常搞嵌入式開(kāi)發(fā)的朋友對(duì)于交叉編譯環(huán)境應(yīng)該并不陌生,說(shuō)白了,就是一組運(yùn)行在x86 PC機(jī)的編譯工具,可以讓你在PC機(jī)上編譯出目標(biāo)平臺(tái)(例如ARM)可識(shí)別的二進(jìn)制文件。Android平臺(tái)也提供了這樣的交叉編譯工具鏈,就放在Android的NDK開(kāi)發(fā)包的toolchains目錄下,因此,我們的Makefile文件中,只需給出相應(yīng)的編譯工具即可。


廢話(huà)就先說(shuō)到這,直接上例子,我們目標(biāo)是把下面這個(gè)math.c文件編譯成一個(gè)靜態(tài)庫(kù)文件


#include <stdio.h>

int add( int a , int b ) {
    return a+b;
}


你需要編寫(xiě)一個(gè)Makefile文件,這里假設(shè)你的Android ndk被安裝在 /opt/android/ndk 目錄下,當(dāng)然,你可以根據(jù)自己的實(shí)際情況修改Makefile中相關(guān)路徑的定義,Makefile文件示例如下


# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform

.PHONY: clean

NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm

CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-

CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld

CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =

TARGET = libmath.a
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)

all: $(OBJS)
        $(AR) -rc $(TARGET) $(OBJS)
clean:
        rm -f *.o *.a *.so

這里不講Makefile文件的基本原理,只說(shuō)明一下針對(duì)Android環(huán)境的Makefile文件編寫(xiě)的注意事項(xiàng)。


(1) CROSS_COMPILE


必須正確給出Android NDK編譯工具鏈的路徑,當(dāng)在目錄中執(zhí)行make命令的時(shí)候,編譯系統(tǒng)會(huì)根據(jù) CROSS_COMPILE 前綴尋找對(duì)應(yīng)的編譯命令。


(2) -I$(PLATFORM)/usr/include


由于Android平臺(tái)沒(méi)有使用傳統(tǒng)的c語(yǔ)言庫(kù)libc,而是自己編寫(xiě)了一套更加高效更適合嵌入式平臺(tái)的c語(yǔ)言庫(kù),所以系統(tǒng)頭文件目錄不能再使用默認(rèn)的路徑,必須直到Android平臺(tái)的頭文件目錄


(3) -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp


這些參數(shù)的意義網(wǎng)上基本上都有介紹,我就不一一解釋了,并不都是必須添加的,但比較常用。


編譯方法:


寫(xiě)好makefile文件,并且保存之后,就可以直接在當(dāng)前目錄下執(zhí)行make命令,編譯完成后,當(dāng)前目錄下會(huì)生成 libmath.a ,即可直接拿到Android的jni工程中和使用了。


關(guān)于如何直接使用Makefile文件交叉編譯Android平臺(tái)的c/c++代碼就介紹到這里了,有任何疑問(wèn)歡迎留言或者來(lái)信lujun.hust@gmail.com交流,或者關(guān)注我的新浪微博 @盧_俊 獲取最新的文章和資訊。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI