[Android Software/Hacking General [Developers Only]] d1mbu1b:
Seems to me the Android NDK has been abstracted to the point of obscurity.

I understand the need for a regimented application framework; but talk about over engineering...

> cd $(NDK_HOME)

> build/host-setup.sh

> make app=hello-jni

# ... some magic ...

> cd apps/hello-jni/project

> android.bat update project -p .

> ant debug

# ... more magic ...

> adb install bin/hello-jni-debug.apk

#hey wait wheres my c executable...

> vi apps/hello-jni/project/jni/Android.mk

# change BUILD_SHARED_LIBRARY to BUILD_EXECUTABLE

>make app=hello-jni

# there we go

what a pain, not to mention porting existing posix code with multiple dependencies...

Here is my Makefile developed in cygwin on windows by running:

> make APP=hello-jni V=1

and copying all the pertinent flags into a generic Makefile...

Hope this helps anyone having the same frustrations.

.KEEP_STATE:

#
# Android NDK tool chain setup
# run cd ~/android/ndk; make APP-xxx -V1 to obtain toolchain values
#

NDK=/home/Administrator/android/ndk
GCC=$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gcc
AR=$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-ar
STRIP=$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-strip

NDK_INCLUDE=-I$(NDK)/build/platforms/android-3/arch-arm/usr/include

NDK_CFLAGS=\
-march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork \
-ffunction-sections -funwind-tables -fstack-protector -fno-short-enums \
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
-mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 \
-DANDROID \

#
# THIS WORKS
#

NDK_LDFLAGS=\
-nostdlib -Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc \
$(NDK)/build/platforms/android-3/arch-arm/usr/lib/libc.so \
$(NDK)/build/platforms/android-3/arch-arm/usr/lib/libstdc++.so \
$(NDK)/build/platforms/android-3/arch-arm/usr/lib/libm.so \
$(NDK)/build/platforms/android-3/arch-arm/usr/lib/crtbegin_dynamic.o \
-Wl,--no-undefined -Wl,-rpath-link=$(NDK)/build/platforms/android-3/arch-arm/usr/lib \
$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a \
$(NDK)/build/platforms/android-3/arch-arm/usr/lib/crtend_android.o

#
# Local setup
#

INCLUDE=$(NDK_INCLUDE) -I../sockets -I.
CFLAGS=$(NDK_CFLAGS)

LDFLAGS=$(NDK_LDFLAGS)
LDPATH=$(NDK_LDPATH) -L../sockets -L.
LIBS=$(NDK_LIBS) -ludp -lsockets

OBJS=$(NDK_OBJS) \
udp.o \
readTest.o \
hostnameToIp.o

# Implicit target definition for generating objects. (don't touch!)
.c.o:
$(GCC) $(INCLUDE) $(CFLAGS) -Wall -D__cygwin__ -O2 -DNDEBUG -g -c -MMD -MP -MF $@.d.tmp $< -o $@

# Target section
all: libudp.a readTest writeTest udpRecord multiRead multiWrite
# Dependency section
libudp.a: udp.o hostnameToIp.o multi.o
$(AR) crs $@ udp.o multi.o hostnameToIp.o
#ranlib $@

udpRecord: udpRecord.o libudp.a
$(GCC) udpRecord.o $(LDFLAGS) $(LDPATH) $(LIBS) -o udpRecord
$(STRIP) --strip-debug $@

readTest: readTest.o libudp.a
$(GCC) readTest.o $(LDFLAGS) $(LDPATH) $(LIBS) -o readTest
$(STRIP) --strip-debug $@

writeTest: writeTest.o libudp.a
$(GCC) writeTest.o $(LDFLAGS) $(LDPATH) $(LIBS) -o writeTest
$(STRIP) --strip-debug $@

multiRead: multiRead.o libudp.a
$(GCC) multiRead.o $(LDFLAGS) $(LDPATH) $(LIBS) -o multiRead
$(STRIP) --strip-debug $@

multiWrite: multiWrite.o libudp.a
$(GCC) multiWrite.o $(LDFLAGS) $(LDPATH) $(LIBS) -o multiWrite
$(STRIP) --strip-debug $@

clean:
-rm *.o *.a *.o.d.tmp

now its a simple

> make

> adb push program /data

> adb shell chmod 777 /data/program

> adb shell /data/program

this should be useful for command line tools and inittab daemons