[英]How to compile C into an executable binary file and run it in Android from Android Shell?
我有一個安裝了 Android Gingerbread 2.3.4 的設備在這里我想在 android 設備上運行 C 可執行文件
我能夠在此設備上運行 android NDK 應用程序,並且運行完美。 但我只想在設備上運行一個hello.c
可執行文件。
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
有什么辦法可以用Android NDK
工具鏈編譯這個文件,這樣我就可以運行這個文件的可執行文件嗎?
我在這里找到了一件事,但這對我不起作用。 我正在使用Android NDK, Revision 7b
於 Linux 的Android NDK, Revision 7b
。 沒有這樣的目錄結構。
首先,讓我說我的答案取決於您在 Linux 上使用 NDK r7b(它也適用於 r7c)(為其他系統適當更改路徑)。
編輯:最后在Linux和Nexus 4
上使用NDK r8e
進行測試,在Windows 7上使用SDK Platform-Tools Rev 18
adb
(截至 2013 年7月 25日最新),無需 root 訪問。
另一個編輯:請閱讀此問題以更改我對需要在Android 5.0(Lollypop)及更高版本上運行的本機二進制文件的說明。
$NDK_ROOT
(解壓縮時 NDK zip 的最頂層文件夾)。$NDK_ROOT/samples/hello-jni
目錄復制為$NDK_ROOT/sources/hello-world
。$NDK_ROOT/sources/hello-world
。AndroidManifest.xml
為應用程序提供適當的名稱(這是可選的)。$NDK_ROOT/sources/hello-world/jni
。 這是源代碼所在。hello-jni.c
,刪除所有代碼,然后放入你的hello world
代碼。 我的是:#包括 \n int main( int argc, char* argv[])\n {\n printf("你好,世界!");\n 返回0;\n }
Android.mk
並將行include $(BUILD_SHARED_LIBRARY)
更改為include $(BUILD_EXECUTABLE)
。 您還可以將LOCAL_MODULE
行更改為您想要的可執行文件的名稱(默認為hello-jni
)$NDK_ROOT/sources/hello-world
../../ndk-build
以創建可執行文件。$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
復制到 Android 設備上的/data/local/tmp
並將其權限更改為 755 (rwxr-xr-x)。 如果您更改了$NDK_ROOT/sources/hello-world/jni/Android.mk
的LOCAL_MODULE
行, $NDK_ROOT/sources/hello-world/jni/Android.mk
執行文件名稱將是LOCAL_MODULE
的新值,而不是hello-jni
。 (所有這些都是通過 Android SDK 中的adb
完成的。)/data/local/tmp/hello-jni
,或任何您命名的文件。大功告成(可以自由地開始閱讀 $NDK_ROOT/docs 中的文檔以更好地了解要做什么)。
放置可執行文件的最佳/最簡單的位置是/data/local 。 您還需要將二進制文件chmod為可執行文件。 通常,您還需要分兩步執行此操作,以將二進制文件從/sdcard/
到/data/local
:
$ adb push mybin /sdcard/
$ adb shell
$ cp /sdcard/mybin /data/local/mybin
$ cd /data/local
$ chmod 751 mybin
注意事項:
並非所有系統都有cp
。 如果是這種情況,您可以使用cat :
$ cat /sdcard/mybin > /data/local/mybin
某些系統不允許為“shell”用戶寫入/data/local
。 試試/data/local/tmp
我最近在新的 nexus-5 上遇到了同樣的問題。 我想補充一點,我使用 adb shell 獲得的 /data/local 不是用戶可寫的(“shell”,uid 2000)。 但是將可執行文件放在子目錄 /data/local/tmp/ 中工作正常。
“/sdcard”位置不可執行,這意味着那里的任何文件根本不可執行。
“adb push”可執行文件的唯一方法是將它們放在“/data/local”中,這對於adb應該是可寫的,並允許任何人執行。
簡而言之,
首先,要從主機交叉編譯 C 代碼,請使用帶有 sysroot 選項和位置無關選項-fPIE -pie
NDK 工具鏈。
$NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc \
--sysroot=$NDKROOT/platforms/android-22/arch-arm64 -fPIE -pie main.c -o main
arch 部分arrch64
或arch-arm64
、工具鏈版本部分4.9
、平台版本部分android-22
以及主機darwin-x86_64
的二進制格式可能因您的環境而異。
其次,將您的二進制文件推送到/data/local/tmp
並從adb shell
執行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.