Ho un progetto nativo che, in frustrazione con il sistema di creazione, ho funzionato semplicemente bloccando tutto il codice insieme molti anni fa. Ho tentato di portare correttamente il progetto a gradle-experimental, ma questo è ancora un disastro 2.5 anni dopo. Ora sto cercando di far funzionare il sistema Android.mk all'interno del progetto riorganizzato (per gradle-experimental).Moduli nidificati Android ndk
Ecco l'organizzazione:
- jpeg (full nativo)
- processore (piena nativo, dipendente da jpeg)
- biblioteca (JNI, dipendente dal processore e 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)
So che potrei appiattire questo se Io uso i file make, ma credo che un giorno, nel 2020, Android Studio supporterà davvero il nativo, quindi ho pensato di mantenere il formato del progetto corrente.
Qui sono i miei file marca:
modulo/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)
/jni jpeg:
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)
processore/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)
Quando eseguo ndk-build, creerà correttamente jpeg quando arriva alla build del processore. Sarà tuttavia non riescono a costruire qualsiasi codice di riferimento jpeg (processore) con i riferimenti non definiti come:
undefined reference to `jpeg_std_error (jpeg_error_mgr *)'
Ho la sensazione che sto facendo qualcosa di leggermente sbagliato nella configurazione del genitore Android.mk tale che LOCAL_STATIC_LIBRARIES += libjpeg
non sta importando correttamente. Qualcuno sa cosa potrei fare di sbagliato qui?
Cosa intendi con "tirato"? – rmtheis
Stavo usando una libreria jpeg-turbo compatibile con Android che ho aggiunto la "c" extern, tuttavia anni dopo ho completamente dimenticato di prendere il ramo destro quando ho provato a portarlo a gradle-experimental. Questo è ciò che intendevo per "tirato fuori sbagliato" – Anthony