在为Android编译OpenCV Core模块时,包括在Eclipse中未解析的指令引用

时间:2014-12-17 00:33:42

标签: android c++ opencv makefile android-ndk

我正在尝试为Android编译OpenCV 2.4.9核心模块(c ++源代码)。我试图在Windows 8(64位机器)上使用Eclipse / Android NDK来做这件事。我对OpenCV核心模块(c ++代码)进行了一些修改,并希望在android上构建/测试它。以下是我到目前为止采取的步骤:

  • 创建新的Android库项目(文件 - >新建 - >项目... - > Android应用程序项目)
  • 选中“将此项目标记为库”选项
  • 创建后,添加原生支持(右键单击项目并选择Android工具 - >添加原生支持...)
  • 从jni文件夹中删除默认cpp文件
  • 添加 Application-14.mk 文件
  • 修改 Android.mk 文件

Application-14.mk 文件内容:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi
APP_PLATFORM := android-14

Android.mk 文件内容:

LOCAL_PATH := $(call my-dir)
LINKED_FILES_SRC := ../../../Shared/OpenCV249/modules/core

include $(CLEAR_VARS)

LOCAL_MODULE := opencv_core

LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES += $(LINKED_FILES_SRC)/src
LOCAL_C_INCLUDES += $(LINKED_FILES_SRC)/include

LOCAL_SRC_FILES  := $(LINKED_FILES_SRC)/src/tables.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/system.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/stat.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/rand.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/persistence.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/parallel.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/out.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/opengl_interop_deprecated.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/opengl_interop.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/matrix.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/matop.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/matmul.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/mathfuncs.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/lapack.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/gpumat.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/glob.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/gl_core_3_1.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/dxt.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/drawing.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/datastructs.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/copy.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/convert.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/cmdparser.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/array.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/arithm.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/alloc.cpp
LOCAL_SRC_FILES  += $(LINKED_FILES_SRC)/src/algorithm.cpp

include $(BUILD_SHARED_LIBRARY)

这是我尝试构建

时的输出
C:\droidev\android-ndk-r10c\ndk-build.cmd -w all 
make.exe: Entering directory `C:/Projects/Enterprise/MobileServices/UM/Android/opencv_core'
[armeabi] Compile++ thumb: opencv_core <= tables.cpp
In file included from jni/../../../Shared/OpenCV249/modules/core/src/tables.cpp:49:0:
jni/../../../Shared/OpenCV249/modules/core/src/precomp.hpp:48:33: fatal error: opencv2/core/core.hpp: No such file or directory
make.exe: Leaving directory `C:/Projects/Enterprise/MobileServices/UM/Android/opencv_core'
compilation terminated.
make.exe: *** [obj/local/armeabi/objs/opencv_core/__/__/__/Shared/OpenCV249/modules/core/src/tables.o] Error 1

以下是上面输出中引用的文件的位置。

C:\Projects\Enterprise\MobileServices\UM\Shared\OpenCV249\modules\core\include\opencv2\core\core.hpp
C:\Projects\Enterprise\MobileServices\UM\Shared\OpenCV249\modules\core\src\precomp.hpp
C:\Projects\Enterprise\MobileServices\UM\Shared\OpenCV249\modules\core\src\tables.cpp

以下是precomp.hpp中与错误相关的行:

#include "opencv2/core/core.hpp"

因此,core.hpp 与precomp.hpp 相关,因此无法找到opencv2/core/core.hpp。我通常在Visual Studio中工作,当您为c ++项目配置包含目录时,它的行为有所不同(例如,如果我将C:\Projects\Enterprise\MobileServices\UM\Shared\OpenCV249\modules\core\include作为附加的包含目录,则不会发生上述错误)。我试过移动文件(和文件的副本),但由于include指令在OpenCV源文件中的方式,我解决了这个特定的错误后遇到其他错误。我还尝试了我能想到的LOCAL_C_INCLUDES变量的每个组合,因为它与include目录有关。

有谁知道如何更好地描述在我的makefile中搜索包含文件/目录的位置?我应该在makefile中以不同的方式配置包含吗?任何人都知道如何获得“Visual Studio like”包括我上面提到的功能?

1 个答案:

答案 0 :(得分:0)

我能够在以下更正后进行编译:

  • 将相对路径转换为 Android.mk
  • 中的绝对路径
  • Application-14.mk 重命名为 Application.mk
  • 添加剩余的依赖项(zlib,liblog和动态cuda包含)

这是 Android.mk 所有更改(这是为我编译的,但我还没有测试过该库):

##############################################################
# Setup Paths
##############################################################
LOCAL_PATH      := $(call my-dir)
APP_PROJECT_PATH:= $(realpath .)
CORE_ROOT       := $(APP_PROJECT_PATH)/../../Shared/OpenCV249/modules/core
DYNAMICCUDA_ROOT:= $(APP_PROJECT_PATH)/../../Shared/OpenCV249/modules/dynamicuda
ZLIB_ROOT       := $(APP_PROJECT_PATH)/../../Shared/OpenCV249/3rdparty/zlib

##############################################################
# zlib module configuration
##############################################################
include $(CLEAR_VARS)

LOCAL_MODULE    := zlib

LOCAL_C_INCLUDES:= $(LOCAL_PATH)/zlib

LOCAL_SRC_FILES := $(ZLIB_ROOT)/adler32.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/compress.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/crc32.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/deflate.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/gzclose.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/gzlib.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/gzread.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/gzwrite.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/infback.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/inffast.c  
LOCAL_SRC_FILES += $(ZLIB_ROOT)/inflate.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/inftrees.c
LOCAL_SRC_FILES += $(ZLIB_ROOT)/trees.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/uncompr.c 
LOCAL_SRC_FILES += $(ZLIB_ROOT)/zutil.c

include $(BUILD_STATIC_LIBRARY)

##############################################################
# opencv_core module configuration
##############################################################
include $(CLEAR_VARS)

LOCAL_MODULE    := opencv_core

LOCAL_STATIC_LIBRARIES := zlib

LOCAL_C_INCLUDES:= $(LOCAL_PATH)
LOCAL_C_INCLUDES+= $(CORE_ROOT)/src
LOCAL_C_INCLUDES+= $(CORE_ROOT)/include
LOCAL_C_INCLUDES+= $(DYNAMICCUDA_ROOT)/src
LOCAL_C_INCLUDES+= $(DYNAMICCUDA_ROOT)/include

LOCAL_SRC_FILES := $(CORE_ROOT)/src/algorithm.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/alloc.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/arithm.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/array.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/cmdparser.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/convert.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/copy.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/datastructs.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/drawing.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/dxt.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/gl_core_3_1.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/glob.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/gpumat.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/lapack.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/mathfuncs.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/matmul.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/matop.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/matrix.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/opengl_interop.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/opengl_interop_deprecated.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/out.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/parallel.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/persistence.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/rand.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/stat.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/system.cpp
LOCAL_SRC_FILES += $(CORE_ROOT)/src/tables.cpp

LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)