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

我有设备上我安装了Android姜饼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没有这样的目录结构

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

编辑:最后使用NDK r8eLinuxNexus 4上进行testing,使用SDK Platform-Tools Rev 18 adb不包括root访问权 )在Windows 7上进行testing。

另一个编辑:请阅读这个问题,以改变我的指令,需要在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代码。 我的是:
      #包括 
     int main(int argc,char * argv [])
     {
         printf(“Hello,World!”);
        返回0;
     } 
  7. 编辑Android.mk并将include $(BUILD_SHARED_LIBRARY)行更改为include $(BUILD_EXECUTABLE) 。 您还可以将LOCAL_MODULE行更改为您的可执行文件的名称(默认为hello-jni
  8. 回到$NDK_ROOT/sources/hello-world
  9. 运行../../ndk-build来创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. 执行完整path为/data/local/tmp/hello-jni的二进制/data/local/tmp/hello-jni ,或者任何你命名的文件。

你已经完成了(可以自由地开始使用$ NDK_ROOT / docs中的文档来更好地了解该怎么做)。

放置可执行文件的最好/最简单的地方是/ data / local 。 你还需要chmod二进制文件作为可执行文件。 通常,您还需要分两步执行此操作,以从/sdcard/ to /data/local获取二进制文件:

 $ adb push mybin /sdcard/ $ adb shell $ cp /sdcard/mybin /data/local/mybin $ cd /data/local $ chmod 751 mybin 

注意事项

  • 并不是所有的系统都有cp 。 如果是这样,你可以使用猫 :

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

  • 有些系统不允许写入“shell”用户的/data/local 。 试试/data/local/tmp

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

“/ SD卡”位置不可执行,这意味着任何文件都不可执行。

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

简而言之,

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

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

其次,把你的二进制文件放在/data/local/tmp ,并从adb shell执行。