Android ndk вложенные модули

У меня есть родной проект, который в расстройстве с системой make я работал, просто заклинив весь код вместе много лет назад. Я попытался правильно доставить проект до gradle -experimental, но это все еще катастрофа спустя 2,5 года. Теперь я пытаюсь заставить систему Android.mk работать в реорганизованном (для gradle -experimental) проекте.

Здесь организация:

  • 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 по-настоящему поддержит родной язык, поэтому я решил сохранить текущий формат проекта.

Вот мои файлы make:

модуль /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 (в процессоре) с помощью ссылок undefined, таких как:

undefined ссылка на `jpeg_std_error (jpeg_error_mgr *) '

У меня такое чувство, что я делаю что-то немного неправильное в настройке родительского Android.mk, так что LOCAL_STATIC_LIBRARIES += libjpeg неправильно импортирует. Кто-нибудь знает, что я могу делать неправильно здесь?

Ответ 1

Оказывается, я вытащил неправильный заголовок jpeg, у которого не было extern "C", чтобы помочь с изменением имени в С++. Фиксирование заголовка затронуло проблему.

Кроме того, мне пришлось реорганизовать структуру папок, поскольку вложенный NDK - это кошмар, если все проекты не подпадают под jni. Он начнет манипулировать LOCAL_PATH, подстановочные знаки и в основном любой относительный путь.