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

use*_*679 44 c android android-ndk

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

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

/* #includes #defines ... */

int main(){
    // Do something when this is executed
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sam*_*een 39

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

编辑:最后与测试NDK r8e的Linux,并Nexus 4adb来自SDK Platform-Tools Rev 18Windows 7的(最新作的2013年7月25日)没有根访问.

然而另一个编辑:请阅读此问题,以更改我需要在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代码.我的是:
    #include 
    int main( int argc, char* argv[])
    {
        printf("Hello, World!");
        return 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. 将其复制$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni/data/local/tmpAndroid设备上,并将其权限更改为755(rwxr-xr-x).如果您更改了LOCAL_MODULE$NDK_ROOT/sources/hello-world/jni/Android.mk,则可执行文件名将是新值LOCAL_MODULE而不是hello-jni.(所有这些都是通过adbAndroid SDK完成的.)
  11. 使用完整路径执行二进制文件/data/local/tmp/hello-jni,或者将其命名为.

而且你已经完成了(并且可以免费开始使用$ NDK_ROOT/docs中的文档来更好地了解要做什么).

  • 样本目录下有`test-libstdc ++`项目,看起来就像你要解释的那样. (5认同)

NuS*_*ler 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
Run Code Online (Sandbox Code Playgroud)

警告:

  • 并非所有系统都有cp.如果是这种情况,你可以使用cat:

    $ cat /sdcard/mybin > /data/local/mybin

  • 某些系统不允许/data/local为"shell"用户写入.尝试/data/local/tmp

  • 不正确,你**不需要root,你只需要将二进制文件放在应用程序可写的位置,例如它的私有目录. (2认同)

小智 12

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


dvh*_*vhh 11

"/ sdcard"位置不可执行,这意味着任何文件根本不可执行.

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

  • 在Lollipop(在我的Xperia Z3上)我需要将它复制到`/ data/local/tmp`并且有效. (2认同)

9re*_*9re 5

简而言之,

首先,要从主机交叉编译 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
Run Code Online (Sandbox Code Playgroud)

拱形部分 arrch64或者arch-arm64,该工具链版本的一部分 4.9平台版本的一部分 android-22,和二进制格式为您的主机 darwin-x86_64可能因环境而异。

其次,将您的二进制文件推入/data/local/tmp并从adb shell.