我有一个原生项目,在制作系统的挫折中,我通过简单地将所有代码堵塞在一起多年前就开始工作了。我试图将项目正确地移植到gradle-experimental,但这仍然是2.5年后的灾难。我现在正试图让Android.mk系统在重组(用于gradle-experimental)项目中工作。
这是组织:
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
无法正确导入。有谁知道我在这里做错了什么?
答案 0 :(得分:6)
原来我拉错了没有外部“C”的jpeg标题,以帮助在c ++中进行名称修改。修复标题解决了这个问题。
此外,我必须重新组织文件夹结构,因为如果所有项目都不属于jni,嵌套NDK是一场噩梦。它将开始修改LOCAL_PATH,通配符,以及基本上任何相对路径。