Android NDK вложенные модули
у меня есть родной проект, который в расстройстве с системой make я получил работу, просто сжимая весь код вместе много лет назад. Я попытался правильно перенести проект на gradle-experimental, но это все равно катастрофа 2,5 года спустя. Теперь я пытаюсь достать Андроида.система МК для работы в рамках реорганизованного (для градл-экспериментального) проекта.
вот организация:
- jpeg (полный родной) (полный родной, зависит от jpeg)
- библиотека (jni, зависит от процессора и jpeg)
module
-jni (contains Application.mk, Android.mk)
-jpeg
--src
---main
----jni
-----Android.mk (and source co-located)
-processor
--src
----main
-----jni
------Android.mk
------/processor(source)
-library
--src
----main
-----java
-----jni
-----Android.mk (and source co-located)
Я знаю, что могу сгладить это, если я использую файлы make, но я думаю, что когда-нибудь в 2020 году Android Studio действительно будет поддерживать родной, поэтому я решил сохранить текущий формат проекта.
вот моя марка файлы:
модуль / jni:
LOCAL_PATH := $(call my-dir)
STARTUP_DIR := $(LOCAL_PATH)
include $(STARTUP_DIR)/../jpeg/src/main/jni/Android.mk
include $(STARTUP_DIR)/../processor/src/main/jni/Android.mk
include $(STARTUP_DIR)/../library/src/main/jni/Android.mk
include $(CLEAR_VARS)
jpeg / jni:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_SRC_FILES := [truncated]
LOCAL_CFLAGS += -DAVOID_TABLES
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
#LOCAL_CFLAGS += -march=armv6j
# enable tile based decode
LOCAL_CFLAGS += -DANDROID_TILE_BASED_DECODE
ifeq ($(TARGET_ARCH_VARIANT),x86-atom)
LOCAL_CFLAGS += -DANDROID_INTELSSE2_IDCT
LOCAL_SRC_FILES += jidctintelsse.c
endif
# enable armv6 idct assembly
ifeq ($(strip $(TARGET_ARCH)),arm)
LOCAL_CFLAGS += -DANDROID_ARMV6_IDCT
endif
# use mips assembler IDCT implementation if MIPS DSP-ASE is present
ifeq ($(strip $(TARGET_ARCH)),mips)
ifeq ($(strip $(ARCH_MIPS_HAS_DSP)),true)
LOCAL_CFLAGS += -DANDROID_MIPS_IDCT
LOCAL_SRC_FILES +=
mips_jidctfst.c
mips_idct_le.S
endif
endif
LOCAL_MODULE := libjpeg
include $(BUILD_STATIC_LIBRARY)
процессор / jni
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -DUSE_JPEG
LOCAL_STATIC_LIBRARIES += libjpeg
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../../jpeg/src/main/jni
LOCAL_MODULE := processor
LOCAL_SRC_FILES := [truncated]
LOCAL_C_INCLUDES += [truncated]
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/processor/include
LOCAL_LDLIBS += -lz
include $(BUILD_SHARED_LIBRARY)
когда я запускаю ndk-build, он успешно построит jpeg, когда он доберется до сборки процессора. Однако он не сможет создать код, ссылающийся на jpeg (в процессоре) с неопределенными ссылками, такими как:
неопределенная ссылка на 'jpeg_std_error (jpeg_error_mgr*)'
у меня такое чувство, что я делаю что-то немного неправильно в настройке родительского Android.МК такой что LOCAL_STATIC_LIBRARIES += libjpeg
неправильно импортирует. Кто-нибудь знает, что я здесь делаю не так?
1 ответов
оказывается, я вытащил неправильный заголовок jpeg, у которого не было extern "C", чтобы помочь с искажением имени на c++. Исправление заголовка решило проблему.
кроме того, мне пришлось реорганизовать структуру папок, поскольку вложенный NDK-это кошмар, если все проекты не попадают под jni. Он начнет искажать LOCAL_PATH, подстановочные знаки и в основном любой относительный путь.