Android ndk 嵌套模块

Android ndk nested modules

本文关键字:模块 嵌套 ndk Android      更新时间:2023-10-16

我有一个原生项目,由于对 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 将真正支持本机,所以我想我会保留当前的项目格式。

这是我的制作文件:

模块/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没有正确导入。 有人知道我可能在这里做错了什么吗?

事实证明,

我拉了错误的 jpeg 标头,该标头没有外部"C"来帮助在 c++ 中进行名称重整。 修复标头解决了该问题。

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