Подтвердить что ты не робот

Нет правила для создания целевой NDK

Я компилирую собственные источники и добавляю зависимости с .a libs и этими относительными файлами заголовков со следующей структурой.

/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)

- Используется для вызова подпапок mk файлов

/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/включить

Заголовочные файлы. (.h)

Но при попытке ndk-build (NDK5) я получил следующую ошибку.

[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.

При наборе текста я заметил, что ошибка о /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 ', что не так в моих файлах make?

Проблему можно было бы избежать, изменив первый Android.mk на следующее:

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)

Но это выглядит неправильно. Есть ли лучший подход?

4b9b3361

Ответ 1

Из Документов в NDK 5 решение состоит в создании локальной переменной.

мой-Dir   Возвращает путь последнего включенного Makefile, который обычно является   в текущем каталоге Android.mk. Это полезно для определения   LOCAL_PATH в начале вашего Android.mk как с:

    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.

Итак, чтобы решить эту проблему, я меняю свой Android.mk на следующие.

 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)

И его работы.

Ответ 2

Я думаю, что это верно, чтобы определить локальный путь после включения субфайлов.

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)

Это выглядит неправильно. Я думаю, вы можете просто попробовать:

 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)

Надеюсь, что это поможет.