use*_*679 44 c android android-ndk
我有安装Android Gingerbread 2.3.4的设备在这里我想在Android设备上运行C可执行文件
我能够在Device上运行android NDK应用程序,并且它运行完美但是我想hello.c在Device上只运行一个可执行文件.
/* #includes #defines ... */
int main(){
// Do something when this is executed
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法用Android NDK工具链编译这个文件,我们可以运行这个文件的可执行文件
我在这里发现了一件事,但这对我来说不起作用我使用Android NDK, Revision 7blinux没有像这样的目录结构
Sam*_*een 39
首先,让我说我的答案取决于你在Linux上使用NDK r7b(它也适用于r7c)(适当地改变其他系统的路径).
编辑:最后与测试NDK r8e上的Linux,并Nexus 4与adb来自SDK Platform-Tools Rev 18 于Windows 7的(最新作的2013年7月25日)没有根访问.
然而另一个编辑:请阅读此问题,以更改我需要在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代码.我的是:#include
int main( int argc, char* argv[])
{
printf("Hello, World!");
return 0;
}Android.mk并将行更改include $(BUILD_SHARED_LIBRARY)为include $(BUILD_EXECUTABLE).您还可以将LOCAL_MODULE行更改为可执行文件所需的名称(默认为hello-jni)$NDK_ROOT/sources/hello-world../../ndk-build以创建可执行文件.$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni到/data/local/tmpAndroid设备上,并将其权限更改为755(rwxr-xr-x).如果您更改了LOCAL_MODULE行$NDK_ROOT/sources/hello-world/jni/Android.mk,则可执行文件名将是新值LOCAL_MODULE而不是hello-jni.(所有这些都是通过adbAndroid SDK完成的.)/data/local/tmp/hello-jni,或者将其命名为.而且你已经完成了(并且可以免费开始使用$ NDK_ROOT/docs中的文档来更好地了解要做什么).
NuS*_*ler 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
Run Code Online (Sandbox Code Playgroud)
警告:
并非所有系统都有cp.如果是这种情况,你可以使用cat:
$ cat /sdcard/mybin > /data/local/mybin
某些系统不允许/data/local为"shell"用户写入.尝试/data/local/tmp
小智 12
我最近在新的nexus-5上遇到了同样的问题.我想补充说/ data/local不是用户可写的("shell",uid 2000)我用adb shell.但是将可执行文件放在子目录/ data/local/tmp /中工作正常.
dvh*_*vhh 11
"/ sdcard"位置不可执行,这意味着任何文件根本不可执行.
"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
Run Code Online (Sandbox Code Playgroud)
在拱形部分 arrch64或者arch-arm64,该工具链版本的一部分 4.9,平台版本的一部分 android-22,和二进制格式为您的主机 darwin-x86_64可能因环境而异。
其次,将您的二进制文件推入/data/local/tmp并从adb shell.