4

我按照这里的说明成功添加了 OpenCV。但是几天来,我也一直在尝试将 tesseract 添加到 Android.mk 中,但一直无法做到。

我有一个使用 tesseract 的android.cpp,所以我必须在我的 Android.mk 中包含依赖项。我发现这篇帖子几乎有确切的问题,他解决了它,将libtess.soliblept.so文件导入 Android.mk,但没有解释如何做到这一点,所以我查看并找到了这篇显示如何链接的帖子预建库。因此,基于此,我尝试了这个 Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := liblept
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libtess
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk
OPENCV_CAMERA_MODULES := off
include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk

LOCAL_MODULE    := run_detection
LOCAL_SHARED_LIBRARIES := libtess
LOCAL_SRC_FILES := text_detect.cpp android.cpp
LOCAL_LDLIBS    += -landroid -llog -ldl

include $(BUILD_SHARED_LIBRARY)

并得到了这个输出:

[armeabi-v7a] Prebuilt       : liblept.so <= src/main/jni/../libs/armeabi-v7a/
[armeabi-v7a] Install        : liblept.so => src/main/jniLibs/armeabi-v7a/liblept.so
[armeabi-v7a] Compile++ thumb: run_detection <= text_detect.cpp
In file included from src/main/jni/text_detect.h:4:0,
                 from src/main/jni/text_detect.cpp:10:
src/main/jni/../../../../tess-two/jni/com_googlecode_tesseract_android/src/api/baseapi.h:32:22: fatal error: platform.h: No such file or directory
 #include "platform.h"
                      ^
compilation terminated.

所以我猜是没有正确链接 libtess,如果你仔细观察,它不会安装 libtess.so,它看起来像安装liblept.so,然后跳转到text_detect.cpp,忽略这部分:

include $(CLEAR_VARS)
LOCAL_MODULE := libtess
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni
include $(PREBUILT_SHARED_LIBRARY)

因此,我试图强制它完全安装libleptlibtess,然后再将其放入不同的文件中。因此,我将文件的最后一部分放在另一个文件夹中的不同 Android.mk 中,并尝试了 include $(call all-subdir-makefiles),然后它完全安装了 libtessliblept,但忽略了调用 all-subdir-makefiles

新的 jni 文件夹结构:

Android.mk
Application.mk
text_detect/
     Android.mk
     android.cpp
     text_detect.cpp
     text_detect.h

安卓.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := liblept
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libtess
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jni
include $(PREBUILT_SHARED_LIBRARY)

include $(call all-subdir-makefiles)

文本检测/Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk
OPENCV_CAMERA_MODULES := off
include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk

LOCAL_MODULE    := run_detection
LOCAL_SHARED_LIBRARIES := libtess
LOCAL_SRC_FILES := text_detect.cpp android.cpp
LOCAL_LDLIBS    += -landroid -llog -ldl

include $(BUILD_SHARED_LIBRARY)

这是输出:

[armeabi-v7a] Prebuilt       : liblept.so <= src/main/jni/../libs/armeabi-v7a/
[armeabi-v7a] Install        : liblept.so => src/main/jniLibs/armeabi-v7a/liblept.so
[armeabi-v7a] Prebuilt       : libtess.so <= src/main/jni/../libs/armeabi-v7a/
[armeabi-v7a] Install        : libtess.so => src/main/jniLibs/armeabi-v7a/libtess.so
[armeabi] Prebuilt       : liblept.so <= src/main/jni/../libs/armeabi/
[armeabi] Install        : liblept.so => src/main/jniLibs/armeabi/liblept.so
[armeabi] Prebuilt       : libtess.so <= src/main/jni/../libs/armeabi/
[armeabi] Install        : libtess.so => src/main/jniLibs/armeabi/libtess.so
[mips] Prebuilt       : liblept.so <= src/main/jni/../libs/mips/
[mips] Install        : liblept.so => src/main/jniLibs/mips/liblept.so
[mips] Prebuilt       : libtess.so <= src/main/jni/../libs/mips/
[mips] Install        : libtess.so => src/main/jniLibs/mips/libtess.so
[x86] Prebuilt       : liblept.so <= src/main/jni/../libs/x86/
[x86] Install        : liblept.so => src/main/jniLibs/x86/liblept.so
[x86] Prebuilt       : libtess.so <= src/main/jni/../libs/x86/
[x86] Install        : libtess.so => src/main/jniLibs/x86/libtess.so

如您所见,它完美地安装了第一个 Android.mk 中的所有内容,但它从不运行 textdetect/Android.mk

那么,我做错了什么?我怎样才能完成这个看似简单的任务?有没有更简单的方法?

编辑:

在@ph0b 响应之后,我回到我的第一个设置并添加了与原始 MakefileLOCAL_EXPORT_C_INCLUDES相同的内容(有几个变体使其适应我的路径),并且解决了它。它找不到,因为它不知道在哪里寻找它。platform.h

现在,在我进行此更改后,我遇到了一个不同的错误,我认为这是因为它在依赖它No such file or directory #include "com_googlecode_tesseract_android/src/api/baseapi.h"之前没有编译 tesseract 。run_detection好吧,这不是问题,它仍然run_detection在 tesseract 之前编译,但这不是问题,它要简单得多,而且我觉得在这个错误上花了这么多时间很愚蠢。问题是它没有找到com_googlecode_tesseract_android/src/api/baseapi.h,因为我也没有提供路径,所以我从tess-twocom_googlecode_tesseract_android复制了and并添加到. 这是我的最终解决方案:com_googlecode_leptonica_android$(LOCAL_PATH)LOCAL_EXPORT_C_INCLUDES

jni文件夹结构:

Android.mk
Application.mk
text_detect.cpp
android.cpp
text_detect.h
com_googlecode_leptonica_android
com_googlecode_tesseract_android

安卓.mk

LOCAL_PATH := $(call my-dir)

#leptonica
LEPTONICA_LOCAL := $(LOCAL_PATH)/com_googlecode_leptonica_android
LEPTONICA_PATH := $(LEPTONICA_LOCAL)/src

include $(CLEAR_VARS)

LOCAL_MODULE := liblept
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/liblept.so
LOCAL_EXPORT_C_INCLUDES := \
  $(LEPTONICA_LOCAL) \
  $(LEPTONICA_PATH)/src

include $(PREBUILT_SHARED_LIBRARY)

#tesseract
TESSERACT_LOCAL := $(LOCAL_PATH)/com_googlecode_tesseract_android
TESSERACT_PATH := $(TESSERACT_LOCAL)/src

include $(CLEAR_VARS)

LOCAL_MODULE := libtess
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libtess.so
LOCAL_EXPORT_C_INCLUDES := \
  $(LOCAL_PATH) \
  $(TESSERACT_PATH)/api \
  $(TESSERACT_PATH)/ccmain \
  $(TESSERACT_PATH)/ccstruct \
  $(TESSERACT_PATH)/ccutil \
  $(TESSERACT_PATH)/classify \
  $(TESSERACT_PATH)/cube \
  $(TESSERACT_PATH)/cutil \
  $(TESSERACT_PATH)/dict \
  $(TESSERACT_PATH)/opencl \
  $(TESSERACT_PATH)/neural_networks/runtime \
  $(TESSERACT_PATH)/textord \
  $(TESSERACT_PATH)/viewer \
  $(TESSERACT_PATH)/wordrec \
  $(LEPTONICA_PATH)/src \
  $(TESSERACT_LOCAL)
LOCAL_SHARED_LIBRARIES := liblept

include $(PREBUILT_SHARED_LIBRARY)

#opencv
include $(CLEAR_VARS)
OPENCV_PACKAGE_DIR:= /Users/danielsierraf/Documents/OpenCV-2.4.10-android-sdk/sdk
OPENCV_CAMERA_MODULES := off
include $(OPENCV_PACKAGE_DIR)/native/jni/OpenCV.mk

LOCAL_MODULE    := run_detection
LOCAL_SRC_FILES := text_detect.cpp android.cpp
LOCAL_LDLIBS    += -landroid -llog -ldl
LOCAL_SHARED_LIBRARIES += libtess liblept

include $(BUILD_SHARED_LIBRARY)
4

1 回答 1

1

您的最新设置以一种奇怪的方式失败,ndk-build 至少应该尝试编译您的模块。当在它之前定义了ndk模块时,可能存在一个错误all-subdir-makefiles,并且它没有找到您模块的Android.mk。您可以尝试只include $(call all-subdir-makefiles)在您的顶级 Android.mk 中使用。

无论如何,我认为你应该回到你的第一个设置,将你的模块直接放在 jni 根文件夹中。然后,您的主要问题是正确声明包含路径。tess-two/jni 不包含任何标题?他们在tess-two/jni/com_googlecode_*_android/src/*。这意味着您需要在模块声明中列出这些,方法是提供LOCAL_EXPORT_C_INCLUDES变量的所有绝对路径(例如来自原始 Makefile:https ://github.com/rmtheis/tess-two/blob/master/tess-two/jni /com_googlecode_tesseract_android/Android.mk#L33 )

您还需要为 libtess 添加对 liblept 的依赖:LOCAL_SHARED_LIBRARIES := liblept在 libtess 库声明中。

如果还是失败,还有另一种可能:不使用生成的.so文件重新定义libtess和liblept模块,可以直接包含tess-two/jni/Android.mk并使用与tess-two相同的Application.mk(复制`tess-two/jni/Application .mk)。它已经正确定义了 libtess 和 liblept 模块。

于 2015-05-06T09:39:13.940 回答