我有安装了Android Gingerbread 2.3.4的Device 这里我想在Android设备上运行C可执行文件
我能够在Device上运行android NDK应用程序并且它的运行完美
但我想在Device上只运行一个hello.c
可执行文件。
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
有没有办法用Android NDK
工具链编译这个文件,我们可以运行这个文件的可执行文件
我发现了一件事here但是这对我来说不起作用我正在使用linux的Android NDK, Revision 7b
没有像这样的目录结构
答案 0 :(得分:38)
首先,让我说我的答案取决于你在Linux上使用NDK r7b(它也适用于r7c)(适当地改变其他系统的路径)。
修改:上次使用 Linux 上的NDK r8e
进行了测试,Nexus 4
使用来自adb
的{{1}}进行了测试> Windows 7 (最新截至2013-07-25)无root访问权限。
另一个编辑:请阅读this question,了解我需要在 Android 5.0(Lollypop)及更高版本上运行的原生二进制文件的说明。
SDK Platform-Tools Rev 18
(解压缩时NDK zip的最顶层文件夹)。$NDK_ROOT
目录复制为$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
代码。我的是:#include int main( int argc, char* argv[]) { printf("Hello, World!"); return 0; }
hello world
并将第Android.mk
行更改为include $(BUILD_SHARED_LIBRARY)
。您还可以将include $(BUILD_EXECUTABLE)
行更改为您的可执行文件所需的名称(默认为LOCAL_MODULE
)hello-jni
$NDK_ROOT/sources/hello-world
以创建可执行文件。../../ndk-build
复制到Android设备上的$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
,并将其权限更改为755(rwxr-xr-x)。如果您更改了/data/local/tmp
中的LOCAL_MODULE
行,则可执行文件名称将是$NDK_ROOT/sources/hello-world/jni/Android.mk
的新值,而不是LOCAL_MODULE
。 (所有这些都是通过Android SDK中的hello-jni
完成的。)adb
或您为其命名的任何内容。你已经完成了(并且可以免费开始使用$ NDK_ROOT / docs中的文档来更好地了解该做什么)。
答案 1 :(得分: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
<强>注意事项强>:
并非所有系统都有cp
。如果是这种情况,您可以使用cat:
$ cat /sdcard/mybin > /data/local/mybin
某些系统不允许在/data/local
中为“shell”用户写入。试试/data/local/tmp
答案 2 :(得分:12)
我最近在新的nexus-5上遇到了同样的问题。我想补充说/ data / local不是用户可写的(“shell”,uid 2000)我用adb shell。但是将可执行文件放在子目录/ data / local / tmp /中工作正常。
答案 3 :(得分:11)
“/ sdcard”位置不可执行,这意味着任何文件根本不可执行。
“adb push”可执行文件的唯一方法是将它们放在“/ data / local”中,这对于adb应该是可写的,并允许任何人执行。
答案 4 :(得分:4)
简而言之,
首先,要从主机交叉编译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
拱形部分 arrch64
或arch-arm64
,工具链版本部分 4.9
,平台版本部分 android-22
,主机 darwin-x86_64
的二进制格式可能因您的环境而异。
其次,将您的二进制文件推送到/data/local/tmp
下,然后从adb shell
执行。