2016-04-22 36 views
11

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?

risposta

6

È venuto fuori che ho tirato l'intestazione jpeg sbagliata che non aveva la "C" esterna per aiutare con il nome mangling in C++. La correzione dell'intestazione ha risolto il problema.

Inoltre, ho dovuto riorganizzare la struttura delle cartelle poiché NDK annidato è un incubo se tutti i progetti non rientrano in jni. Inizierà a manchinare LOCAL_PATH, caratteri jolly e praticamente qualsiasi percorso relativo.

+0

Cosa intendi con "tirato"? – rmtheis

+1

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