當前位置:首頁 » 編程軟體 » aide編譯ndk

aide編譯ndk

發布時間: 2022-05-14 02:15:15

A. 如何使用android的ndk編譯器 編譯c++的庫

1. 概述 首先回顧一下 Android NDK 開發中,Android.mk 和 Application.mk 各自的職責。 Android.mk,負責配置如下內容: (1) 模塊名(LOCAL_MODULE) (2) 需要編譯的源文件(LOCAL_SRC_FILES) (3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES) (4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS) Application.mk,負責配置如下內容: (1) 目標平台的ABI類型(默認值:armeabi)(APP_ABI) (2) Toolchains(默認值:GCC 4.8) (3) C++標准庫類型(默認值:system)(APP_STL) (4) release/debug模式(默認值:release) 由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現,下面我們將一個個詳細介紹。 2. APP_ABI ABI全稱是:Application binary interface,即:應用程序二進制介面,它定義了一套規則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統和硬體平台中無需改動就能運行。(具體的定義請參考 網路 或者 維基網路 ) 由上述定義可以判斷,ABI定義了規則,而具體的實現則是由編譯器、CPU、操作系統共同來完成的。不同的CPU晶元(如:ARM、Intel x86、MIPS)支持不同的ABI架構,常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。 這就是為什麼我們編譯出來的可以運行於Windows的二進製程序不能運行於Mac OS/linux/Android平台了,因為CPU晶元和操作系統均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進製程序。 而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在一個平台上編譯生成另一個平台上的二進制可執行程序,為什麼可以做到?因為交叉編譯工具實現了另一個平台所定義的ABI規則。我們在Windows/Linux平台使用Android NDK交叉編譯工具來編譯出Android平台的庫也是這個道理。 這里給出最新 Android NDK 所支持的ABI類型及區別: 那麼,如何指定ABI類型呢?在 Application.mk 文件中添加一行即可: APP_ABI := armeabi-v7a //只編譯armeabi-v7a版本 APP_ABI := armeabi armeabi-v7a //同時編譯armeabi,armeabi-v7a版本 APP_ABI := all //編譯所有版本 3. LOCAL_LDLIBS Android NDK 除了提供了Bionic libc庫,還提供了一些其他的庫,可以在 Android.mk 文件中通過如下方式添加依賴: LOCAL_LDLIBS := -lfoo 其中,如下幾個庫在 Android NDK 編譯時就默認鏈接了,不需要額外添加在 LOCAL_LDLIBS 中: (1) Bionic libc庫 (2) pthread庫(-lpthread) (3) math(-lmath) (4) C++ support library (-lstdc++) 下面我列了一個表,給出了可以添加到「LOCAL_LDLIBS」中的不同版本的Android NDK所支持的庫: 下面是我總結的一些常用的CFLAGS編譯選項: (1)通用的編譯選項 -O2 編譯優化選項,一般選擇O2,兼顧了優化程度與目標大小 -Wall 打開所有編譯過程中的Warning -fPIC 編譯位置無關的代碼,一般用於編譯動態庫 -shared 編譯動態庫 -fopenmp 打開多核並行計算, -Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先後順序是從左到右的,即在前面的路徑會被選搜索 -nostdinc 該選項指示不要標准路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。 --sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。 -llibrary 查找名為library的庫進行鏈接 -Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。 -nostdlib 該選項指示鏈接的時候不要使用標准路徑下的庫文件 (2) ARM平台相關的編譯選項 -marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集 -march=name 指定特定的ARM架構,常用的包括:-march=armv6, -march=armv7-a -mfpu=name 給出目標平台的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16 -mfloat-abi=name 給出目標平台的浮點預算ABI,支持的參數包括:「soft」, 「softfp」 and 「hard」

B. Eclipse中NDK無法編譯(哪怕是一個新建的空白項目)

首先eclipse能運行.cmd文件嗎?cmd不是windows命令行嗎,能直接在系統運行。另外錯誤報的信息是沒有在classpath找到這個文件,一是你的ndk-build.cmd文件在E:\\NDK目錄下不存在,二有可能是eclipse
java
compiler不支持編譯.cmd文件,然後在classpath下找不到生成的.class文件,同樣會報錯。因為看不到你的project,所以只能根據猜測第二種情況要大一些。

C. aide的gradle工程支持ndk嗎

Android Studio 1.3 版本新增了NDK支持,能夠很方便的在上面開發C++或者C代碼。

簡單介紹方法:
一.首先將Android Studio更新到1.3版本:
1.檢查Android Studio更新.

可能會遇到問題:版本低於1.3檢查更新卻提示已經是最新版本。
那是因為更新渠道不是Beta渠道,需要先將渠道設置為Beta渠道才能更新到1.3:

然後重新檢查更新就可以更新到1.3了.

二.將gradle切換到實驗版本.
根據Google官方提供的方法修改Gradle文件.(官方說法為測試版本不完善,需要手動修改Gradle文件以便兼容Gradle實驗版,他們會在release版本中實現程序自動修改Gradle)
Google原文鏈接:http://tools.android.com/tech-docs/new-build-system/gradle-experimental
1.將Gradle更新到2.5版本.

在這里將GradleVersion改為2.5 點擊OK鍵就會開始自動更新Gradle了.
2.Android NDK r10e ,將NDK更新到這個版本
3.BuildTools版本要求大於19.0.0

D. AIDE源碼怎麼編譯製作

你試試先使用dx工具將.class文件轉換成一個dex文件,如果你有資源文件的話然後使用aapt工具將你的資源文件進行壓縮打包,最後把前兩步的文件用apkbuilder工具打包成apk

E. AIDE能進行C語言編譯嗎

可以的,不過要下載C/C++支持包,而且編譯的時候要改Android.mk文件AIDE能進行C語言編譯嗎

F. android開發,怎麼使用ndk編譯成.so文件

一、首先下載android-ndk,官方網站是:http://developer.android.com/tools/sdk/ndk/index.html
目前最新的版本是android-ndk-r8e-windows-x86.zip,下載地址:
http://dl.google.com/android/ndk/android-ndk-r8e-windows-x86.zip
下載後把壓縮包解壓出來,例如:D:\ndk,目錄下的ndk-build.cmd就是用來編譯的批處理命令。
二、編譯,打開cmd命令行窗口,cd進入目錄:D:\ndk\samples\hello-jni,
然後執行命令:D:\ndk\ndk-build.cmd(如果設置過環境變數則直接使用ndk-build.cmd)來編譯hello-jni,如果沒有錯誤會輸出:
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
Gdbsetup : libs/armeabi/gdb.setup
"Compile thumb : hello-jni <= hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => libs/armeabi/libhello-jni.so
三、創建android應用程序並使用so文件
打開eclipse創建一個android應用程序HelloJni,默認的com.example.hellojni包下面有一個MainActivity.java,
在此包下添加一個HelloJni.java,

G. 我的手機裝不了aide3.2的ndk

可能是,手機內存不夠,垃圾太多了,你清理下垃圾,要麼就是手機壞了。

H. 為什麼安卓的AIDE編譯器編譯好的app反編譯發現裡面多了一個幾個類, ADRTsender

左配置文件里設置Debug=false

I. android studio怎樣進行ndk編譯

1、新建一個Android工程,這一步就不多說了;
2、在AndroidStudio中配置NDK路徑,方法是:
(1)先下載NDK並安裝(這句基本是廢話);
(2)點菜單欄的File->ProjectStructure…->在打開的窗口中左側選中SDKLocation->在右側Android NDK Location中填入NDK目錄所在路徑
3、編譯生成.class文件,方法是:
點菜單欄的Build->Make Project
這時,在工程的app/build/intermediates下就會生成classes文件夾,打開classes目錄下的debug目錄就會看到以你的包名命名的各級文件夾,最里邊文件夾下有你的Java類對應的.class文件;
4、確定你要引用本地方法的類:
其實你也可以先生成jni目錄,再去創建這個類,但是先Google顯然建議先創建要引用C代碼的Java類,因為AndroidStudio可以根據你在java類中定義的native方法的名稱來自動生成.h頭文件。
比如你想在MainActivity中引用本地方法,那麼你先用
static {
System.loadLibrary("myNativeLib");
}
來聲明本地代碼庫,然後定義幾個natvie方法,比如
public native String getStringFromNative();
5、使用javah命令行生成jni目錄及對應的頭文件:
我用的是AndroidStudio 2.1.1,在主界面最下邊就能找到Terminal,點一下就能打開系統的命令行工具,並且已經為你自動cd到當前工程所在目錄
6、配置build.gradle文件
這里的build.gradle是指app模塊下的build.gradle,不是整個工程的build.gradle文件。在模塊的build.gradle的defaultConfig下加入以下idk配置:

ndk {
moleName"myNativeLib"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
7、配置local.properties文件
打開工程目錄下的local.properties,感覺這一步是自動配置的,或者說在你一開始在AndroidStudio中指定NDK目錄時已經自動生成了。我的AndroidStudio在打開local.properties已經有了
ndk.dir=/Develop/Android/android-ndk-r10e
這一行,所以就不用配了;
8、配置gradle.properties
打開工程目錄下的gradle.properties文件(注意不是build.gradle,而是gradle.properties),在文件的最後一行加入
android.useDeprecatedNdk=true
這句的作用是允許我們使用已經過時的NDK版本,不知道AndroidStudio要求使用哪個版本的NDK才不會報錯,總之只要配置了這一句就可以使用比較舊的NDK版本了,我用的r10;
至此我們在AndroidStudio中就完成了NDK環境的配置,接下來就可以寫Native代碼了;
9、寫一個.c文件測試一下是否運行正常
(1)在我們之前生成src/main/jni目錄下新建一個.c文件,方法是在jni文件夾上點滑鼠右鍵,選擇New->C/C++ Source File,然後在彈出的對話框中填入.c或.cpp文件的文件名就可以了,比如說mail.c

J. 如何設置NDK的編譯選項

1. 概述

首先回顧一下 Android NDK 開發中,Android.mk 和Application.mk 各自的職責。

Android.mk,負責配置如下內容:

(1) 模塊名(LOCAL_MODULE)

(2) 需要編譯的源文件(LOCAL_SRC_FILES)

(3) 依賴的第三方庫(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)

(4) 編譯/鏈接選項(LOCAL_LDLIBS、LOCAL_CFLAGS)

Application.mk,負責配置如下內容:

(1) 目標平台的ABI類型(默認值:armeabi)(APP_ABI)

(2) Toolchains(默認值:GCC 4.8)

(3) C++標准庫類型(默認值:system)(APP_STL)

(4) release/debug模式(默認值:release)

由此我們可以看到,本文所涉及的編譯選項在Android.mk和Application.mk中均有出現,下面我們將一個個詳細介紹。

2. APP_ABI

ABI全稱是:Application binary interface,即:應用程序二進制介面,它定義了一套規則,允許編譯好的二進制目標代碼在所有兼容該ABI的操作系統和硬體平台中無需改動就能運行。(具體的定義請參考網路或者維基網路)

由上述定義可以判斷,ABI定義了規則,而具體的實現則是由編譯器、CPU、操作系統共同來完成的。不同的CPU晶元(如:ARM、Intel x86、MIPS)支持不同的ABI架構,常見的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

這就是為什麼我們編譯出來的可以運行於Windows的二進製程序不能運行於Mac OS/Linux/Android平台了,因為CPU晶元和操作系統均不相同,支持的ABI類型也不一樣,因此無法識別對方的二進製程序。

而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在一個平台上編譯生成另一個平台上的二進制可執行程序,為什麼可以做到?因為交叉編譯工具實現了另一個平台所定義的ABI規則。我們在Windows/Linux平台使用Android NDK交叉編譯工具來編譯出Android平台的庫也是這個道理。

這里給出最新 Android NDK 所支持的ABI類型及區別:

下面是我總結的一些常用的CFLAGS編譯選項:

(1)通用的編譯選項

-O2 編譯優化選項,一般選擇O2,兼顧了優化程度與目標大小

-Wall 打開所有編譯過程中的Warning

-fPIC 編譯位置無關的代碼,一般用於編譯動態庫

-shared 編譯動態庫

-fopenmp 打開多核並行計算,

-Idir 配置頭文件搜索路徑,如果有多個-I選項,則路徑的搜索先後順序是從左到右的,即在前面的路徑會被選搜索

-nostdinc 該選項指示不要標准路徑下的搜索頭文件,而只搜索-I選項指定的路徑和當前路徑。

--sysroot=dir 用dir作為頭文件和庫文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫文件,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。

-llibrary 查找名為library的庫進行鏈接

-Ldir 增加-l選項指定的庫文件的搜索路徑,即編譯器會到dir路徑下搜索-l指定的庫文件。

-nostdlib 該選項指示鏈接的時候不要使用標准路徑下的庫文件

(2) ARM平台相關的編譯選項

-marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集

-march=name 指定特定的ARM架構,常用的包括:-march=armv6, -march=armv7-a

-mfpu=name 給出目標平台的浮點運算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16

-mfloat-abi=name 給出目標平台的浮點預算ABI,支持的參數包括:「soft」, 「softfp」 and 「hard」

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:713
php跳過if 發布:2025-05-12 15:34:29 瀏覽:466
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:129
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:163
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:732
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:147
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:396
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:539
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:627
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:363