Android ndk 嵌套模块
Android ndk nested modules
我有一个本机项目,我对多年前通过简单地将所有代码塞在一起而开始工作的 make 系统感到沮丧。我试图将项目正确移植到 gradle-experimental,但 2.5 年后这仍然是一场灾难。我现在正在尝试让 Android.mk 系统在重组后的(针对 gradle-实验)项目中工作。
组织如下:
- 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 将真正支持原生,所以我认为我会保留当前的项目格式。
这是我的制作文件:
module/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)
processor/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 reference to `jpeg_std_error(jpeg_error_mgr*)'
我感觉我在设置父级 Android.mk 时做错了一些事情,导致 LOCAL_STATIC_LIBRARIES += libjpeg
没有正确导入。有人知道我在这里可能做错了什么吗?
结果我提取了错误的 jpeg header,它没有 extern "C" 来帮助在 C++ 中进行名称重整。修复 header 解决了这个问题。
此外,我不得不重新组织文件夹结构,因为如果所有项目都不属于 jni,嵌套的 NDK 将是一场噩梦。它将开始处理 LOCAL_PATH、通配符和基本上任何相对路径。
我有一个本机项目,我对多年前通过简单地将所有代码塞在一起而开始工作的 make 系统感到沮丧。我试图将项目正确移植到 gradle-experimental,但 2.5 年后这仍然是一场灾难。我现在正在尝试让 Android.mk 系统在重组后的(针对 gradle-实验)项目中工作。
组织如下:
- 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 将真正支持原生,所以我认为我会保留当前的项目格式。
这是我的制作文件:
module/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)
processor/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 reference to `jpeg_std_error(jpeg_error_mgr*)'
我感觉我在设置父级 Android.mk 时做错了一些事情,导致 LOCAL_STATIC_LIBRARIES += libjpeg
没有正确导入。有人知道我在这里可能做错了什么吗?
结果我提取了错误的 jpeg header,它没有 extern "C" 来帮助在 C++ 中进行名称重整。修复 header 解决了这个问题。
此外,我不得不重新组织文件夹结构,因为如果所有项目都不属于 jni,嵌套的 NDK 将是一场噩梦。它将开始处理 LOCAL_PATH、通配符和基本上任何相对路径。