我有一个设备上,我安装了Android姜饼2.3.4在这里,我想在Android设备上运行C可执行文件
我能够在这个设备上运行android NDK应用程序,它运行完美.但我只想在设备上运行一个hello.c
可执行文件。
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
有没有办法用Android NDK
工具链编译这个文件,这样我就可以运行这个文件的可执行文件了?
我发现了一件事here,但这是不为我工作。我正在使用Linux的Android NDK, Revision 7b
。没有这样的目录结构。
6条答案
按热度按时间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.编辑
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中的文档,以便更好地了解要做什么)。
db2dz4w82#
放置可执行文件的最佳/最简单位置是**/data/local**。您还需要将二进制文件chmod为可执行文件。通常,您还需要分两步执行此操作,以将二进制文件从
/sdcard/
获取到/data/local
:注意事项:
cp
。如果是这种情况,可以使用cat:$ cat /sdcard/mybin > /data/local/mybin
/data/local
中写入。试试/data/local/tmp
jq6vz3qz3#
“/sdcard”位置是不可执行的,这意味着任何文件都是不可执行的。
“adb push”可执行文件的唯一方法是将它们放在“/data/local”中,这应该是adb可写的,并允许任何人执行。
jdzmm42g4#
我最近在一个新的Nexus-5上遇到了同样的问题。我想补充的是,/data/local是不可写的用户(“shell”,uid 2000),我得到了与adb shell。但是将可执行文件放在目录/data/local/tmp/中工作正常。
gopyfrb35#
简而言之
首先,要从主机交叉编译C代码,请使用NDK工具链和sysroot选项以及位置无关选项
-fPIE -pie
。请注意,arch部分
aarch64
或aarch-arm64
、工具链版本部分4.9
、平台版本部分android-22
以及宿主机的二进制格式darwin-x86_64
可能因您的环境而异。其次,将二进制文件推送到
/data/local/tmp
下,然后从adb shell
执行。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