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

时间:2012-03-26 07:39:52

标签: android c android-ndk

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

我能够在Device上运行android NDK应用程序并且它的运行完美 但我想在Device上只运行一个hello.c可执行文件。

/* #includes #defines ... */

int main(){
    // Do something when this is executed
    return 0;
}

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

我发现了一件事here但是这对我来说不起作用我正在使用linux的Android NDK, Revision 7b 没有像这样的目录结构

5 个答案:

答案 0 :(得分:38)

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

修改:上次使用 Linux 上的NDK r8e进行了测试,Nexus 4使用来自adb的{​​{1}}进行了测试> Windows 7 (最新截至2013-07-25)无root访问权限

另一个编辑:请阅读this question,了解我需要在 Android 5.0(Lollypop)及更高版本上运行的原生二进制文件的说明。

  1. 转到SDK Platform-Tools Rev 18(解压缩时NDK zip的最顶层文件夹)。
  2. $NDK_ROOT目录复制为$NDK_ROOT/samples/hello-jni
  3. 转到$NDK_ROOT/sources/hello-world
  4. 编辑$NDK_ROOT/sources/hello-world以为应用程序指定一个合适的名称(这是可选的)。
  5. 转到AndroidManifest.xml。这是源代码的所在。
  6. 修改$NDK_ROOT/sources/hello-world/jni,删除所有代码,然后输入hello-jni.c代码。我的是:
    #include 
    int main( int argc, char* argv[])
    {
        printf("Hello, World!");
        return 0;
    }
  7. 修改hello world并将第Android.mk行更改为include $(BUILD_SHARED_LIBRARY)。您还可以将include $(BUILD_EXECUTABLE)行更改为您的可执行文件所需的名称(默认为LOCAL_MODULE
  8. 返回hello-jni
  9. 运行$NDK_ROOT/sources/hello-world以创建可执行文件。
  10. 将其从../../ndk-build复制到Android设备上的$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni,并将其权限更改为755(rwxr-xr-x)。如果您更改了/data/local/tmp中的LOCAL_MODULE行,则可执行文件名称将是$NDK_ROOT/sources/hello-world/jni/Android.mk的新值,而不是LOCAL_MODULE。 (所有这些都是通过Android SDK中的hello-jni完成的。)
  11. 执行带有完整路径的二进制文件adb或您为其命名的任何内容。
  12. 你已经完成了(并且可以免费开始使用$ NDK_ROOT / docs中的文档来更好地了解该做什么)。

答案 1 :(得分:24)

放置可执行文件的最佳/最简单的地方是 / 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

  • 某些系统不允许在/data/local中为“shell”用户写入。试试/data/local/tmp

答案 2 :(得分:12)

我最近在新的nexus-5上遇到了同样的问题。我想补充说/ data / local不是用户可写的(“shell”,uid 2000)我用adb shell。但是将可执行文件放在子目录/ data / local / tmp /中工作正常。

答案 3 :(得分:11)

“/ sdcard”位置不可执行,这意味着任何文件根本不可执行。

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

答案 4 :(得分:4)

简而言之,

首先,要从主机交叉编译C代码,请使用带有sysroot选项的NDK工具链和位置独立选项-fPIE -pie

$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

拱形部分 arrch64arch-arm64工具链版本部分 4.9平台版本部分 android-22主机 darwin-x86_64的二进制格式可能因您的环境而异。

其次,将您的二进制文件推送到/data/local/tmp下,然后从adb shell执行。