2011-01-03 7 views
16

Estoy compilando fuentes nativas y agregando las dependencias con .a libs y aquellos archivos de encabezado relativos con la siguiente estructura.No hay regla para hacer objetivo NDK

/jni/

Android.mk

LOCAL_PATH := $(call my-dir) 
include $(call all-subdir-makefiles) 

include $(CLEAR_VARS) 

LOCAL_LDLIBS := -llog 
LOCAL_MODULE := ndk1 
LOCAL_SRC_FILES := native.c 
LOCAL_STATIC_LIBRARY := mschema 
include $(BUILD_SHARED_LIBRARY) 

native.c

/jni/prereqs/

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(call all-subdir-makefiles) 

include $(CLEAR_VARS) 

--Used para llamar a los archivos mk subcarpetas

/JNI/prereqs/mschema/

Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE :=mschema 
LOCAL_SRC_FILES :=libmschema.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 

include $(PREBUILT_STATIC_LIBRARY) 

libmschema.a

/JNI/prereqs/mschema/include

Archivos de cabecera. (.h)

Pero mientras trataba de ndk-build (NDK5) recibí el siguiente error.

[email protected]:~/dev/workspace/rmsdk.native.wraper$ ndk-buildmake: 
*** No rule to make target `/home/marcos/dev/workspace/rmsdk.native.wraper/jni/prereqs/mschema/native.c', needed by `/home/marcos/dev/workspace/rmsdk.native.wraper/obj/local/armeabi/objs/ndk1/native.o'. Stop. 

mientras se escribe me señaló el error es de un /home/marcos/dev/workspace/rmsdk.native.wraper/jni/prereqs/mschema/native.c' and actually this file is under /home/marcos/dev/workspace/rmsdk.native.wraper/jni/native.c', lo que está mal en mis archivos de maquillaje?

El problema podría evitarse cambiando el primer Android.mk a lo siguiente:

LOCAL_PATH := $(call my-dir) 
include $(call all-subdir-makefiles) 
LOCAL_PATH :=/home/marcos/dev/workspace/rmsdk.native.wraper/jni 
include $(CLEAR_VARS) 
LOCAL_LDLIBS := -llog 
LOCAL_MODULE := ndk1 
LOCAL_SRC_FILES := native.c 
LOCAL_STATIC_LIBRARY := mschema 
include $(BUILD_SHARED_LIBRARY) 

pero se ve mal. ¿Hay un mejor enfoque?

Respuesta

33

Desde el Docs en NDK 5, la solución es crear una variable local ..

mi-dir Devuelve la ruta de la última incluido Makefile, que por lo general es el directorio actual de Android.mk. Esto es útil para definir LOCAL_PATH en el inicio de su Android.mk como con:

LOCAL_PATH := $(call my-dir) 

IMPORTANT NOTE: Due to the way GNU Make works, this really returns 
the path of the *last* *included* *Makefile* during the parsing of 
build scripts. Do not call my-dir after including another file. 

Así que .. para resolver este problema de que cambie de Android.mk a lo siguiente.

LOCAL_PATH := $(call my-dir) 
MY_PATH := $(LOCAL_PATH) 
include $(call all-subdir-makefiles) 

include $(CLEAR_VARS) 

LOCAL_PATH := $(MY_PATH) 

LOCAL_LDLIBS := -llog -ldl 
LOCAL_MODULE := rmsdk 
LOCAL_SRC_FILES := native.c 

include $(BUILD_SHARED_LIBRARY) 

Y sus obras.

+0

"No llamar a my-dir después de incluir otro archivo". línea ahorró mucho tiempo. Gracias. – Sanket

0

Creo que es cierto para def ruta local después de incluir subarchivos.

LOCAL_PATH := $(call my-dir) 
MY_PATH := $(LOCAL_PATH) 
include $(call all-subdir-makefiles) 

include $(CLEAR_VARS) 

LOCAL_PATH := $(MY_PATH) 

LOCAL_LDLIBS := -llog -ldl 
LOCAL_MODULE := rmsdk 
LOCAL_SRC_FILES := native.c 

include $(BUILD_SHARED_LIBRARY) 

Parece incorrecto. Creo que puedes probar esto:

include $(call all-subdir-makefiles) 

include $(CLEAR_VARS) 

LOCAL_PATH := $(call my-dir) 

LOCAL_LDLIBS := -llog -ldl 
LOCAL_MODULE := rmsdk 
LOCAL_SRC_FILES := native.c 

include $(BUILD_SHARED_LIBRARY) 

Hope it helps.

+0

Estaba equivocado ... (((( – busylee

+0

) No puede hacer eso porque "my-dir Devuelve la ruta del último Makefile incluido, que normalmente es el directorio actual de Android.mk. Esto es útil para definir LOCAL_PATH al inicio de su Android.mk como con: " –

Cuestiones relacionadas