亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android開發實踐:Android交叉編譯工具鏈的使用

發布時間:2020-04-02 05:01:57 來源:網絡 閱讀:4468 作者:Jhuster 欄目:移動開發

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


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


廢話就先說到這,直接上例子,我們目標是把下面這個math.c文件編譯成一個靜態庫文件


#include <stdio.h>

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


你需要編寫一個Makefile文件,這里假設你的Android ndk被安裝在 /opt/android/ndk 目錄下,當然,你可以根據自己的實際情況修改Makefile中相關路徑的定義,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文件的基本原理,只說明一下針對Android環境的Makefile文件編寫的注意事項。


(1) CROSS_COMPILE


必須正確給出Android NDK編譯工具鏈的路徑,當在目錄中執行make命令的時候,編譯系統會根據 CROSS_COMPILE 前綴尋找對應的編譯命令。


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


由于Android平臺沒有使用傳統的c語言庫libc,而是自己編寫了一套更加高效更適合嵌入式平臺的c語言庫,所以系統頭文件目錄不能再使用默認的路徑,必須直到Android平臺的頭文件目錄


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


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


編譯方法:


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


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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁明县| 泰来县| 焦作市| 芮城县| 台州市| 莒南县| 平遥县| 同德县| 高尔夫| 彭山县| 杭锦后旗| 玉树县| 广昌县| 岳普湖县| 余江县| 浪卡子县| 郓城县| 凤冈县| 晋城| 虹口区| 梧州市| 乃东县| 吐鲁番市| 伊金霍洛旗| 贡山| 清徐县| 石景山区| 什邡市| 东方市| 肇源县| 桂林市| 霞浦县| 清丰县| 天柱县| 平潭县| 林西县| 伊通| 永修县| 嘉定区| 勐海县| 光山县|