我有一台安装了Android Gingerbread 2.3.4的设备这里我想在安卓设备上运行C可执行文件
我能够在这个设备上运行android NDK应用程序,它运行得很完美。但我只想在设备上运行一个hello.c
可执行文件。
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
有没有办法用Android NDK
工具链编译这个文件,这样我就可以运行这个文件的可执行文件?
我在这里发现了一件事,但这对我不起作用。我正在使用Android NDK, Revision 7b
for Linux。没有这样的目录结构。
首先,让我说我的答案取决于您在Linux上使用NDK r7b(它也适用于r7c)(为其他系统适当更改路径)。
编辑:上次在Linux上使用NDK r8e
进行测试,在Windows7的SDK Platform-Tools Rev 18
中使用adb
进行Nexus 4
测试(最新截止日期为2013-07-25)无root访问。
另一个编辑:请阅读此问题,以更改我对需要在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
代码。我的是:#includeint main(int argc,char*argv[]){printf("你好,世界!");返回0;}
- 编辑
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
复制到/data/local/tmp
,并将其权限更改为755(rwxr-xr-x)。如果更改了$NDK_ROOT/sources/hello-world/jni/Android.mk
中的LOCAL_MODULE
行,则可执行文件名称将是LOCAL_MODULE
的新值,而不是hello-jni
。(所有这些都是通过Android SDK中的adb
完成的。) - 执行二进制文件,其完整路径为
/data/local/tmp/hello-jni
,或任何您将其命名为的路径
您已经完成了(可以自由地开始使用$NDK_ROOT/docs中的文档,以便更好地了解该做什么)。
放置可执行文件的最佳/最简单位置是/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
有些系统不允许为"shell"用户写入
/data/local
。尝试/data/local/tmp
"/sdcard"位置不可执行,这意味着那里的任何文件都不可执行。
"adb-push"可执行文件的唯一方法是将它们放在"/data/local"中,这对于adb来说应该是可写的,并且允许任何人执行。
我最近在一个新的next-5上遇到了同样的问题。我想补充一点,/data/local对我使用adb shell获得的用户("shell",uid 2000)是不可写的。但是将可执行文件放在子目录/data/local/tmp/中运行良好。
简而言之,
首先,要从主机交叉编译C代码,请使用带有sysroot选项和位置独立选项-fPIE -pie
的NDK工具链。
$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
请注意,拱形部件aarch64
或aarch-arm64
、工具链版本部件4.9
、平台版本部件CD_41以及主机的二进制格式darwin-x86_64
可能因环境而异。
其次,将二进制文件推送到/data/local/tmp
下,并从adb shell
执行它。