如何将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和行/列跨度祸