50
votes

I'm trying to build a simple Android application using NDK. Here are the contents of my Android.mk

LOCAL_PATH := $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_LDLIBS := -llog  

LOCAL_MODULE    := myNDK
LOCAL_SRC_FILES := native.c

include $(BUILD_SHARED_LIBRARY)

And when I'm running ndk-build I get:

make: * No rule to make target '/native.c', needed by '/Users/ivan/Documents/workspace/TestNDK/obj/local/armeabi/objs/myNDK/native.o'. Stop.

So the problem is obviously that make is searching the source files in the root directory and if I copy native.c to my root folder everything works perfectly.

The question is: what should I specify in my Android.mk to set the LOCAL_PATH to my working jni folder.

6
It is really helpful, thank you.lijinma

6 Answers

88
votes

OK, I've solved my issue, and the reason was very strange: the problem is in the first line

'LOCAL_PATH := $(call my-dir)____'

It had several spaces in the end (I've replaced them with '_'). If you remove them everything works just fine.

Hope that helps someone else.

1
votes

On Mac OS X using android-ndk-r9 64 bit, remove white spaces from the NDK path. That fixed the No rule to make target error for me

Not exactly an answer for OP, but I guess it can save others from wasting their time.

1
votes

Another problem that I found that causes this error is that the

LOCAL_SRC_FILES := native.c

and

LOCAL_MODULE    := native

use the same name. I'm not sure why this causes an error, as the code should be generated in different locations as native.o, native.od, and native. But, apparently it does.

I found this out while trying to compile hello.c to hello. Once I changed hello.c to main.c, everything compiled properly.

0
votes

If there are any syntax error in Android.mk file, no rule to make target error will be there.

I had the same problem.

0
votes

I have faced this issue when there is a spelling mistake in the root directory name.

Example: My path should have been:

 include $(phone-root-dir)/test/test.mk

but there is spelling mistake as shown

include $(lphone-root-dir)/test/test.mk

Once I corrected spelling mistake it worked fine.

0
votes

Make sure LOCAL_PATH is at the top of the Android.mk else it won't work due to GNU Compiler syntax

Android.mk

LOCAL_PATH := $(call my-dir)  
include $(CLEAR_VARS)

Also can have ifeq/endif prior to this if need the ndk-major-at-least shorten path or function defines