Android ndk 嵌套模块
Android ndk nested modules
我有一个原生项目,由于对 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、通配符以及基本上任何相对路径。
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 用C#中的并集模拟C++嵌套结构
- 部分专业化和嵌套模板
- 嵌套While循环不起作用(C++问题)
- C++-模板嵌套类的引用初始化无效
- 如何在嵌套类中正确使用友元声明?
- Android ndk 嵌套模块