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

zsbz8rwp  于 2023-10-16  发布在  Android
关注(0)|答案(6)|浏览(143)

我有一个设备上,我安装了Android姜饼2.3.4在这里,我想在Android设备上运行C可执行文件
我能够在这个设备上运行android NDK应用程序,它运行完美.但我只想在设备上运行一个hello.c可执行文件。

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

有没有办法用Android NDK工具链编译这个文件,这样我就可以运行这个文件的可执行文件了?
我发现了一件事here,但这是不为我工作。我正在使用Linux的Android NDK, Revision 7b。没有这样的目录结构。

cs7cruho

cs7cruho1#

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

**编辑:**最后一次测试是在 Linux 上使用NDK r8e,在 Windows 7 上使用SDK Platform-Tools Rev 18中的adb使用Nexus 4(最新版本为2013-07-25)无root访问权限
**另一个编辑:**请阅读this question更改我的指令,需要在 Android 5.0(Lollypop) 及更高版本上运行的原生二进制文件。

1.转到$NDK_ROOT(解压缩时NDK zip的最高文件夹)。
1.将$NDK_ROOT/samples/hello-jni目录复制为$NDK_ROOT/sources/hello-world
1.转到$NDK_ROOT/sources/hello-world
1.编辑AndroidManifest.xml以给予应用程序一个适当的名称(可选)。
1.转到$NDK_ROOT/sources/hello-world/jni。这就是源代码所在的地方。
1.编辑hello-jni.c,删除所有代码,然后放入hello world代码。标签:

  1. #include
  2. int main( int argc, char* argv[])
  3. {
  4. printf("Hello, World!");
  5. return 0;
  6. }

1.编辑Android.mk并将行include $(BUILD_SHARED_LIBRARY)更改为include $(BUILD_EXECUTABLE)。您还可以将LOCAL_MODULE行更改为您想要的可执行文件的名称(默认值为hello-jni
1.返回$NDK_ROOT/sources/hello-world
1.运行../../ndk-build创建可执行文件。
1.在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完成的。
1.执行完整路径为/data/local/tmp/hello-jni的二进制文件,或者你命名它的任何东西。
这样就完成了(您可以自由地开始使用$NDK_ROOT/docs中的文档,以便更好地了解要做什么)。

展开查看全部
db2dz4w8

db2dz4w82#

放置可执行文件的最佳/最简单位置是**/data/local**。您还需要将二进制文件chmod为可执行文件。通常,您还需要分两步执行此操作,以将二进制文件从/sdcard/获取到/data/local

  1. $ adb push mybin /sdcard/
  2. $ adb shell
  3. $ cp /sdcard/mybin /data/local/mybin
  4. $ cd /data/local
  5. $ chmod 751 mybin

注意事项

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

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

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

jq6vz3qz3#

“/sdcard”位置是不可执行的,这意味着任何文件都是不可执行的。
“adb push”可执行文件的唯一方法是将它们放在“/data/local”中,这应该是adb可写的,并允许任何人执行。

jdzmm42g

jdzmm42g4#

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

gopyfrb3

gopyfrb35#

简而言之
首先,要从主机交叉编译C代码,请使用NDK工具链和sysroot选项以及位置无关选项-fPIE -pie

  1. $NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-gcc \
  2. --sysroot=$NDKROOT/platforms/android-22/arch-arm64 -fPIE -pie main.c -o main

请注意,arch部分aarch64aarch-arm64工具链版本部分4.9平台版本部分android-22以及宿主机的二进制格式darwin-x86_64可能因您的环境而异。
其次,将二进制文件推送到/data/local/tmp下,然后从adb shell执行。

v7pvogib

v7pvogib6#

你听说过一个叫“c4droid”的应用程序吗?
它可以把你的c/cpp代码,直接编译成一个apk文件在你的android手机。你可以通过点击“菜单->导出到apk文件”来实现它
(And你也可以直接运行c/cpp代码在你的android手机通过使用'c4droid')

“c4droid”曾经在Google Play中,但现在不是因为作者决定创建其他应用程序。
但这里是旧的c4droid v8.0应用程序下载链接(我建议你把它放到洪流网络保存它永远,因为它似乎你不能很容易地从正常网络下载,因为它太强大了):
https://www.mediafire.com/file/wnt7txwz5296ajs/c4droid_can_compile_c_into_apk_in_android.tar.gz/file

相关问题