如何将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 r8e
在Linux和Nexus 4
上进行testing,使用SDK Platform-Tools Rev 18
adb
( 不包括root访问权 )在Windows 7上进行testing。
另一个编辑:请阅读这个问题,以改变我的指令,需要在Android 5.0(Lollypop)和以后运行的本机二进制文件。
- 转到
$NDK_ROOT
(解压缩时,NDK zip的最顶层文件夹)。 - 复制
$NDK_ROOT/samples/hello-jni
目录为$NDK_ROOT/sources/hello-world
。 - 转到
$NDK_ROOT/sources/hello-world
。 - 编辑
AndroidManifest.xml
以给应用程序一个合适的名称(这是可选的)。 - 转到
$NDK_ROOT/sources/hello-world/jni
。 这是源代码的地方。 - 编辑
hello-jni.c
,删除所有的代码,并把你的hello world
代码。 我的是:#包括 int main(int argc,char * argv []) { printf(“Hello,World!”); 返回0; }
- 编辑
Android.mk
并将include $(BUILD_SHARED_LIBRARY)
行更改为include $(BUILD_EXECUTABLE)
。 您还可以将LOCAL_MODULE
行更改为您的可执行文件的名称(默认为hello-jni
) - 回到
$NDK_ROOT/sources/hello-world
- 运行
../../ndk-build
来创build可执行文件。 - 将它从
$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
复制到Android设备上的/data/local/tmp
,并将权限更改为755(rwxr-xr-x)。 如果您更改了$NDK_ROOT/sources/hello-world/jni/Android.mk
的LOCAL_MODULE
行,$NDK_ROOT/sources/hello-world/jni/Android.mk
执行文件名将是LOCAL_MODULE
的新值,而不是hello-jni
。 (所有这些都是通过Android SDK的adb
完成的。) - 执行完整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部分 arrch64
或arch-arm64
, 工具链版本部分 4.9
, 平台版本部分 android-22
以及主机 darwin-x86_64
的二进制格式可能因环境而异。
其次,把你的二进制文件放在/data/local/tmp
,并从adb shell
执行。
- Google Cloud Messaging(GCM)使用哪种端口和协议?
- 在另一个应用程序中抑制/阻止BroadcastReceiver
- sendStickyBroadcast和sendBroadcast在Android中有什么区别?
- Android – 以编程方式设置TextView TextStyle?
- 在APK上反编译.smali文件
- GSON投掷“预计BEGIN_OBJECT,但是BEGIN_ARRAY”?
- 在android中缺less共享库。
- java.lang.IllegalArgumentException:错误的类:类java.util.GregorianCalendar
- GridLayout和行/列跨度祸