簡體   English   中英

如何將 C 編譯成可執行的二進制文件並從 Android Shell 在 Android 中運行它?

[英]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)(為其他系統適當更改路徑)。

編輯:最后在LinuxNexus 4上使用NDK r8e進行測試,在Windows 7上使用SDK Platform-Tools Rev 18 adb (截至 2013 年7月 25最新),無需 root 訪問

另一個編輯:請閱讀此問題以更改我對需要在Android 5.0(Lollypop)及更高版本上運行的本機二進制文件的說明。

  1. 轉到$NDK_ROOT (解壓縮時 NDK zip 的最頂層文件夾)。
  2. $NDK_ROOT/samples/hello-jni目錄復制為$NDK_ROOT/sources/hello-world
  3. 轉到$NDK_ROOT/sources/hello-world
  4. 編輯AndroidManifest.xml為應用程序提供適當的名稱(這是可選的)。
  5. 轉到$NDK_ROOT/sources/hello-world/jni 這是源代碼所在。
  6. 編輯hello-jni.c ,刪除所有代碼,然后放入你的hello world代碼。 我的是:
      #包括 \n int main( int argc, char* argv[])\n {\n     printf("你好,世界!");\n    返回0;\n }
  7. 編輯Android.mk並將行include $(BUILD_SHARED_LIBRARY)更改為include $(BUILD_EXECUTABLE) 您還可以將LOCAL_MODULE行更改為您想要的可執行文件的名稱(默認為hello-jni
  8. 回到$NDK_ROOT/sources/hello-world
  9. 運行../../ndk-build以創建可執行文件。
  10. 將其從$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni復制到 Android 設備上的/data/local/tmp並將其權限更改為 755 (rwxr-xr-x)。 如果您更改了$NDK_ROOT/sources/hello-world/jni/Android.mkLOCAL_MODULE行, $NDK_ROOT/sources/hello-world/jni/Android.mk執行文件名稱將是LOCAL_MODULE的新值,而不是hello-jni (所有這些都是通過 Android SDK 中的adb完成的。)
  11. 執行二進制文件的完整路徑為/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 部分arrch64arch-arm64工具鏈版本部分4.9平台版本部分android-22以及主機darwin-x86_64的二進制格式可能因您的環境而異。

其次,將您的二進制文件推送到/data/local/tmp並從adb shell執行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM