如何将C编译成可执行的二进制文件,并从Android Shell在Android中运行



我有一台安装了Android Gingerbread 2.3.4的设备这里我想在安卓设备上运行C可执行文件

我能够在这个设备上运行android NDK应用程序,它运行得很完美。但我只想在设备上运行一个hello.c可执行文件。

/* #includes #defines ... */
int main(){
    // Do something when this is executed
    return 0;
}

有没有办法用Android NDK工具链编译这个文件,这样我就可以运行这个文件的可执行文件?

我在这里发现了一件事,但这对我不起作用。我正在使用Android NDK, Revision 7b for Linux。没有这样的目录结构。

首先,让我说我的答案取决于您在Linux上使用NDK r7b(它也适用于r7c)(为其他系统适当更改路径)。

编辑:上次在Linux上使用NDK r8e进行测试,在Windows7SDK Platform-Tools Rev 18中使用adb进行Nexus 4测试(最新截止日期为2013-07-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代码。我的是:
    #includeint main(int argc,char*argv[]){printf("你好,世界!");返回0;}
  7. 编辑Android.mk并将行include $(BUILD_SHARED_LIBRARY)更改为include $(BUILD_EXECUTABLE)。您也可以将LOCAL_MODULE行更改为可执行文件的名称(默认为hello-jni
  8. 返回$NDK_ROOT/sources/hello-world
  9. 运行../../ndk-build以创建可执行文件
  10. 在Android设备上将其从$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni复制到/data/local/tmp,并将其权限更改为755(rwxr-xr-x)。如果更改了$NDK_ROOT/sources/hello-world/jni/Android.mk中的LOCAL_MODULE行,则可执行文件名称将是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

"/sdcard"位置不可执行,这意味着那里的任何文件都不可执行。

"adb-push"可执行文件的唯一方法是将它们放在"/data/local"中,这对于adb来说应该是可写的,并且允许任何人执行。

我最近在一个新的next-5上遇到了同样的问题。我想补充一点,/data/local对我使用adb shell获得的用户("shell",uid 2000)是不可写的。但是将可执行文件放在子目录/data/local/tmp/中运行良好。

简而言之,

首先,要从主机交叉编译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

请注意,拱形部件aarch64aarch-arm64工具链版本部件4.9平台版本部件CD_41以及主机的二进制格式darwin-x86_64可能因环境而异。

其次,将二进制文件推送到/data/local/tmp下,并从adb shell执行它。

相关内容

  • 没有找到相关文章

最新更新