當前位置:首頁 » 編程軟體 » ndk編譯可執行文件

ndk編譯可執行文件

發布時間: 2023-07-27 21:54:15

A. 如何用Android NDK編譯FFmpeg

android的NDK開發需要在linux下進行:

  1. 因為需要把C/C++編寫的代碼生成能在arm上運行的.so文件,這就需要用到交叉編譯環境,而交叉編譯需要在linux系統下才能完成。

  2. 安裝android-ndk開發包,這個開發包可以在google android 官網下載: 通過這個開發包的工具才能將android jni 的C/C++的代碼編譯成庫

  3. android應用程序開發環境: 包括eclipse、java、 android sdk、 adt等。

NDK編譯步驟:

a.選擇ndk自帶的例子hello-jni,我的位於E:android-ndk-r5sampleshello-jni(根據具體的安裝位置而定) 。

b.運行cygwin,輸入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,進入到E:android-ndk-r5sampleshello-jni目錄。

c.輸入$NDK/ndk-build,執行成功後,它會自動生成一個libs目錄,把編譯生成的.so文件放在裡面。($NDK是調用我們之前配置好的環境變數,ndk-build是調用ndk的編譯程序)

d.此時去hello-jni的libs目錄下看有沒有生成的.so文件,如果有,ndk就運行正常啦。

B. 如何使用自己的makefile編譯android ndk項目

android ndk提供了一套自己的makefile管理方式,要將源碼項目移植到android平台,需要按照android的makefile規則編寫makefile,還要按android的規則部署源碼目錄,對一個有自己的makefile管理方法的大型項目來說,只是做一下makefile遷移工作就是一件很麻煩的事。
其實android ndk上的編譯說到底也就是交叉編譯,只要配置好交叉編譯工具鏈,使用原有的makefile也是可以編譯出在android運行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本為例:
編譯器路徑 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名稱前綴 arm-eabi-
頭文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
庫文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以試一下上面的配置,如果編譯鏈接都沒有問題,可以adb push到android設備上運行看看,什麼結果?
有點崩潰,根本運行不起來,你也許想試試看android自帶的ndk例子,確實是能夠運行的,問題在哪兒呢?
只是正確配置了編譯器、頭文件、庫文件還不夠,還需要配置編譯、鏈接的參數,android例子中編譯鏈接的參數是什麼呢?你也許想深究一下android的makefile,可是不久你會發現那是更崩潰的事情,裡面用了很多的make腳本函數。其實android的makefile是可以把執行的詳細命令輸出來的,只要make的時候加上V=1即可。可以看到確實帶了很多參數
編譯參數:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
鏈接參數:

-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
這其中鏈接參數中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最關鍵的,android使用了自己的進程載入器,並且自定義了c運行時的啟動結束。難怪先前編譯的進程啟動不了。

C. 如何在Android平台下編譯帶STL的C++程序

1、下載最新的Android SDK,下載Android NDK R9C版本。

2、如是在windows平台下需要在PATH中設置環境變數,以便於直接調用NDK來編譯C++程序。

將如下兩個路徑加入到PATH中:<ANDROID_NDK>;<ANDROID_SDK>\platform-tools

其中<NDK>為你的計算機上Android NDK的安裝路徑,<SDK>為Android SDK的安裝路徑

如果在你的SDK下沒有platform-tools目錄,則在Eclipse中按照如下截圖進行操作:

3、為要編譯的C++程序建一個文件夾,如myproject。在myproject下再建一個jni文件夾,將源代碼放在這個文件夾下,myproject/jni。

mkdir myproject

mkdir myproject/jni

4、在jni文件夾下建兩個分別名為:android.mk和
application.mk文件。android.mk類以於C++程序的makefile,application.mk則指明當前程序依賴的庫。

android.mk的示例為:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_first_app #指明C++程序編譯出的可執行程序的名稱

LOCAL_SRC_FILES:= my_first_app0.cpp \ #指明要編譯的源文件,可以有很多個

my_first_app1.cpp\



include$(BUILD_EXECUTABLE)#表明編譯的是可執行程序

/**************************************************************************/

application.mk的示例為:(在application.mk中指明STL庫)

APP_STL:= gnustl_static

這里選STL庫時有四個選項:

system - 使用默認最小的C++運行庫,這樣生成的應用體積小,內存佔用小,但部分功能將無法支持
stlport_static - 使用STLport作為靜態庫,這項是Android開發網極力推薦的
stlport_shared - STLport 作為動態庫,這個可能產生兼容性和部分低版本的Android固件,目前不推薦使用。
gnustl_static - 使用 GNU libstdc++ 作為靜態庫

默認情況下STLPORT是不支持C++異常處理和RTTI,所以不要出現 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static來支持標准C++的特性,但生成的文件體積會偏大,運行效率會低一些。

支持C++異常處理,在Application.mk中加入 LOCAL_CPPFLAGS +=
-fexceptions這句,同理支持RTTI,則加入LOCAL_CPPFLAGS +=
-frtti,這里再次提醒大家,第二條說的使用gnustl靜態庫,而不是stlport。

強制重新編譯 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以強制重新編譯STLPort源碼,由於一些原因可能自己需要修改下STLPort庫,一般普通的開發者無需使用此項

5、打開控制台(cmd),在myproject目錄下用android的NDK build工具編譯C++程序:

cd myproject

$NDK/ndk-build

如果程序沒錯的話,會編譯出android的可執行程序,位置在myproject/libs/armeabi/my_first_app

8、將編譯出來的my_first_app放到手機或是模擬器上運行。在windows的cmd上運行adb.exe。

用adb.exe將my_first_app程序push到手機或模擬器的/data/local目錄上:

adb.exepush myproject\libs\armeabi\my_first_app /data/local。

9、通過adb,在手機上運行my_frist_app:

在cmd上運行:

adb.exe shell

由此進入到手機的linux終端上,接下來再更改my_first_app的許可權使其可以運行:

cd /data/local

chmod 777 my_first_app

./my_first_app//如果沒錯的話,這一步即可運行my_first_app

至此在android上編譯含STL的C++程序的過程結束。

D. 如何建立android的C/C++交叉編譯環境

Android的底層是純粹的linux內核,可以簡單的理解為上面跑了個Dalvik Java虛擬機而
已。因此,構建android上C/C++的交叉編譯環境也就成為了一個很大的需求。特別是對於已經取得root許可權的機器,如果能直接運行按需編譯的二進制文件,那麼將可以做很多有意義和有趣的事情。
很不幸,Google沒有直接給出如何建立這個交叉編譯環境,但是我們可以藉助Google提供的強大的NDK (Native Development Tools)來達到這一目的。
NDK的本來目標是編譯得到.so動態鏈接庫文件,然後通過JNI提供給上層的Java調用,從而實現C/C++程序的簡易遷移。而編譯.so和編譯成二進制可執行文件的過程是完全一樣的,這就給了我們可以發揮的空間。

E. Android.mk介紹(一)

在Linux下,可以通過Makefile來對源碼工程進行管理,Android.mk文件是Makefile的一小部分,它用來對Android程序進行編譯。Android.mk文件中描述了哪些C文件將被編譯且指明了如何編譯。Android.mk文件用來告知NDK Build 系統關於Source的信息。

1、編譯可執行程序

2、編譯動態庫或靜態庫

3、預編譯文件(APK或Java庫)

以上三種是Android.mk的主要用法,我們寫mk文件時也就是以上三種目的。


首先看一個最簡單的Android.mk的例子:

講解:

每個Android.mk文件必須以定義 LOCAL_PATH 為開始。它用於在開發tree中查找源文件。

my-dir 由Build System提供。返回包含Android.mk的目錄路徑。

CLEAR_VARS 變數由Build System提供。並指向一個指定的GNU Makefile,由它負責清理很多LOCAL_xxx.

例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH .

這個清理動作是必須的,因為所有的編譯控制文件由同一個GNU Make解析和執行,其變數是全局的。所以清理後才能避免相互影響。

LOCAL_MODULE 模塊必須定義,以表示Android.mk中的每一個模塊。名字必須唯一且不包含空格。

Build System會自動添加適當的前綴和後綴。例如,foo,要產生動態庫,則生成libfoo.so.

但請注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。

LOCAL_SRC_FILES變數必須包含將要打包如模塊的C/C++ 源碼。

不必列出頭文件,build System 會自動幫我們找出依賴文件。

預設的C++源碼的擴展名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。

BUILD_SHARED_LIBRARY:是Build System提供的一個變數,指向一個GNU Makefile Script。

它負責收集自從上次調用include $(CLEAR_VARS) 後的所有LOCAL_XXX信息。並決定編譯為什麼。

BUILD_STATIC_LIBRARY:編譯為靜態庫。
BUILD_SHARED_LIBRARY :編譯為動態庫
BUILD_EXECUTABLE:編譯為Native C可執行程序

BUILD_PACKAGE(既可以編apk,也可以編資源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)

BUILD_JAVA_LIBRARY(Java共享庫)

BUILD_STATIC_JAVA_LIBRARY(java靜態庫)


Android源碼中有大量的mk文件,Android系統的編譯就是靠著這些mk文件的,所以學好是非常有必要的哦!

F. android項目里的jni中有兩個makefile文件,一個編譯成so文件,另一個包含一個main函數

ndk提供了三種編譯方式,分別為編譯為靜態庫,編譯為動態庫,編譯為可執行文件,如果你的c/c++文件裡面有main函數應該是用來在arm板子或者手機執行的,把編譯模塊的那個位置,使他編譯為可執行文件就好了。

G. NDK 編譯 Boringssl

然後source 命令執行下這個腳本

其中CMAKE_TOOLCHAIN_FILE完全換成boringssl自帶的android.toolchain.cmake 我還添加了一個CMAKE_BUILD_TYPE 設置為Release
CMAKE_MAKE_PROGRAM 可以設置為SDK里自帶的ninja。
執行這個shell腳本,你會在ssl和crypto下得到兩個靜態庫libssl.a和libcrypto.a,頭文件就是boringssl根目錄下的include,導入到你的Android工程就不介紹了,文章很多的。

熱點內容
php對象編程 發布:2025-04-01 06:38:41 瀏覽:331
c語言了5 發布:2025-04-01 06:36:19 瀏覽:141
演算法抖動 發布:2025-04-01 06:30:14 瀏覽:111
ssd做m2的緩存 發布:2025-04-01 06:26:28 瀏覽:541
安卓下載軟體沒有內存怎麼辦 發布:2025-04-01 06:08:36 瀏覽:60
龍珠怎麼上傳視頻 發布:2025-04-01 06:08:24 瀏覽:760
公司代理伺服器地址 發布:2025-04-01 06:05:32 瀏覽:218
minecraftpe戰牆伺服器ip 發布:2025-04-01 06:03:58 瀏覽:912
訪問虛擬機tomcat 發布:2025-04-01 06:02:32 瀏覽:67
linux系統密碼 發布:2025-04-01 06:01:04 瀏覽:976