I have a Device on which I installed Android Gingerbread 2.3.4 Here i want to run C executable file on android device
I am able to run android NDK application on thi
In a nutshell,
First, to cross-compile your C code from your host machine, use NDK toolchain with sysroot option and position independent option -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
the arch part arrch64
or arch-arm64
, the toolchain version part 4.9
, platform version part android-22
, and the binary format for your host machine darwin-x86_64
may vary by your environment.
Second, push your binary under /data/local/tmp
and execute it from adb shell
.
the "/sdcard" location is not executable, meaning that any file there is not executable at all.
the only way to "adb push" executable would be to put them in "/data/local", which should be writable for adb, and allow execution for anyone.
I recently had the same problem on a new nexus-5. I'd like to add that /data/local was not writable by the user ("shell", uid 2000) I got with adb shell. But putting the executable in the subdirectory /data/local/tmp/ worked fine.
First, let me say that my answer is dependent on your using NDK r7b (it'll work for r7c as well) on Linux (change paths appropriately for other systems).
Edit: Last tested with NDK r8e
on Linux and Nexus 4
with adb
from SDK Platform-Tools Rev 18
on Windows 7 (latest as of 2013-07-25) without root access.
Yet Another Edit: Please read this question for altering my instruction for native binaries that need to run on Android 5.0(Lollypop) and later.
$NDK_ROOT
(The topmost folder of NDK zip when unzipped).$NDK_ROOT/samples/hello-jni
directory as $NDK_ROOT/sources/hello-world
.$NDK_ROOT/sources/hello-world
.AndroidManifest.xml
to give the application an appropriate name (This is optional).$NDK_ROOT/sources/hello-world/jni
. This is where the source code is.hello-jni.c
, remove all the code, and put in your hello world
code. Mine is:#include int main( int argc, char* argv[]) { printf("Hello, World!"); return 0; }
Android.mk
and change the line include $(BUILD_SHARED_LIBRARY)
to include $(BUILD_EXECUTABLE)
. You can also change the LOCAL_MODULE
line to the name you want for your executable(default is hello-jni
)$NDK_ROOT/sources/hello-world
../../ndk-build
to create the executable.$NDK_ROOT/sources/hello-jni/libs/armeabi/hello-jni
to /data/local/tmp
on the Android device and change it's permissions to 755 (rwxr-xr-x). If you changed the LOCAL_MODULE
line in $NDK_ROOT/sources/hello-world/jni/Android.mk
, the executable name will be the new value of LOCAL_MODULE
instead of hello-jni
. (All this is done via adb
from the Android SDK.)/data/local/tmp/hello-jni
, or whatever you named it to.And you're done( and free to start on the documentation in $NDK_ROOT/docs to get a better idea of what to do).
The best/easiest place to put a executable is /data/local. You'll also need to chmod the binary as executable. Often you'll also need to do this in two steps to get the binary from /sdcard/
to /data/local
:
$ adb push mybin /sdcard/
$ adb shell
$ cp /sdcard/mybin /data/local/mybin
$ cd /data/local
$ chmod 751 mybin
Caveats:
Not all systems have cp
. You can use cat if this is the case:
$ cat /sdcard/mybin > /data/local/mybin
Some systems don't allow write in /data/local
for the "shell" user. Try /data/local/tmp