Android ndk嵌套模块

时间:2016-04-22 19:43:45

标签: android c++ android-ndk java-native-interface

我有一个原生项目,在制作系统的挫折中,我通过简单地将所有代码堵塞在一起多年前就开始工作了。我试图将项目正确地移植到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(在处理器中)的任何代码
  

未定义对`jpeg_std_error(jpeg_error_mgr *)'的引用

我有一种感觉,我在设置父Android.mk时遇到了一些错误,导致LOCAL_STATIC_LIBRARIES += libjpeg无法正确导入。有谁知道我在这里做错了什么?

1 个答案:

答案 0 :(得分:6)

原来我拉错了没有外部“C”的jpeg标题,以帮助在c ++中进行名称修改。修复标题解决了这个问题。

此外,我必须重新组织文件夹结构,因为如果所有项目都不属于jni,嵌套NDK是一场噩梦。它将开始修改LOCAL_PATH,通配符,以及基本上任何相对路径。