首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Tesseract和Opencv添加到Android.mk (Android.mk)

将Tesseract和Opencv添加到Android.mk (Android.mk)
EN

Stack Overflow用户
提问于 2015-05-04 22:45:36
回答 1查看 3.7K关注 0票数 4

我按照这里的指示成功地添加了OpenCV。但我也一直试图将tesseract添加到Android.mk中,已经有几天了,但一直未能做到这一点。

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

代码语言:javascript
复制
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)

得到了这个输出:

代码语言:javascript
复制
[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,忽略了这一部分:

代码语言:javascript
复制
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)

所以我试着强迫它安装liblept和libtess,然后再把它放在不同的文件中。因此,我将文件的最后一部分放在另一个文件夹中的另一个Android.mk中,并尝试包含$(调用所有-subdir-makefiles),然后它完全安装libtess和liblept,但忽略了调用所有subdir-makefiles。

新的jni文件夹结构:

代码语言:javascript
复制
Android.mk
Application.mk
text_detect/
     Android.mk
     android.cpp
     text_detect.cpp
     text_detect.h

Android.mk

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

这是输出:

代码语言:javascript
复制
[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中的所有东西,但是它从未运行文本检测/Android.mk。

我做错什么了?我怎么能完成这个看似如此简单的任务呢?有更简单的方法吗?

编辑:

在@ph0b响应之后,我回到了我的第一个安装程序,并添加了与原始Makefiles相同的原始Makefiles(有几个变体使它适应我的路径),这就解决了这个问题。它找不到platform.h,因为它不知道在哪里能找到它。

现在,在我做了这个更改之后,我有一个不同的错误No such file or directory #include "com_googlecode_tesseract_android/src/api/baseapi.h",我认为这是因为它没有在依赖于它的run_detection之前编译tesseract。好吧,这不是问题,它仍然在tesseract之前编译run_detection,但这不是问题,它非常简单,我觉得花了那么多时间在这个错误上太愚蠢了。问题是它没有找到com_googlecode_tesseract_android/src/api/baseapi.h,因为我也没有提供路径,所以我从苔丝-2复制了com_googlecode_tesseract_androidcom_googlecode_leptonica_android,并将$(LOCAL_PATH)添加到LOCAL_EXPORT_C_INCLUDES中。这是我的最后解决方案:

jni文件夹结构:

代码语言:javascript
复制
Android.mk
Application.mk
text_detect.cpp
android.cpp
text_detect.h
com_googlecode_leptonica_android
com_googlecode_tesseract_android

Android.mk

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-06 09:39:13

最近的安装失败了,ndk-build至少应该尝试编译您的模块。当在all-subdir-makefiles之前定义了ndk模块时,它可能会出现错误,而且它也找不到模块的Android.mk。您可以尝试只在顶级include $(call all-subdir-makefiles)中使用Android.mk。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30041261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档