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

将Tesseract和Opencv添加到Android.mk(Android Studio),第1张

概述我按照 here的说明成功添加了OpenCV.但是我已经尝试将tesseract添加到Android.mk中,现在已经有几天了,而且还无法做到. 我有一个使用tesseract的android.cpp所以我必须在我的Android.mk中包含依赖项.我发现this post几乎是确切的问题,他解决了它将libtess.so和liblept.so文件导入Android.mk,但没有解释如何做到这一点 我按照 here的说明成功添加了OpenCV.但是我已经尝试将tesseract添加到AndroID.mk中,现在已经有几天了,而且还无法做到.

我有一个使用tesseract的androID.cpp所以我必须在我的AndroID.mk中包含依赖项.我发现this post几乎是确切的问题,他解决了它将libtess.so和liblept.so文件导入AndroID.mk,但没有解释如何做到这一点,所以我看了一下,发现this post显示了如何链接预建库.基于此我尝试了这个AndroID.mk:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODulE := libleptLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/liblept.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jniinclude $(PREBUILT_SHARED_liBRARY)include $(CLEAR_VARS)LOCAL_MODulE := libtessLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/libtess.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jniinclude $(PREBUILT_SHARED_liBRARY)include $(CLEAR_VARS)OPENCV_PACKAGE_DIR:= /Users/danIElsIErraf/documents/OpenCV-2.4.10-androID-sdk/sdkOPENCV_CAMERA_MODulES := offinclude $(OPENCV_PACKAGE_DIR)/native/jnI/OpenCV.mkLOCAL_MODulE    := run_detectionLOCAL_SHARED_liBRARIES := libtessLOCAL_SRC_fileS := text_detect.cpp androID.cppLOCAL_LDliBS    += -landroID -llog -ldlinclude $(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.cppIn 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 := libtessLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/libtess.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jniinclude $(PREBUILT_SHARED_liBRARY)

因此我尝试强制它完全安装liblept和libtess,然后将其放入不同的文件中.所以我将文件的最后一部分放在另一个文件夹中的另一个AndroID.mk中并尝试包含$(调用all-subdir-makefiles),然后完全安装libtess和liblept,但忽略调用all-subdir-makefiles.

新的jni文件夹结构:

AndroID.mkApplication.mktext_detect/     AndroID.mk     androID.cpp     text_detect.cpp     text_detect.h

AndroID.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODulE := libleptLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/liblept.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jniinclude $(PREBUILT_SHARED_liBRARY)include $(CLEAR_VARS)LOCAL_MODulE := libtessLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/libtess.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../tess-two/jniinclude $(PREBUILT_SHARED_liBRARY)include $(call all-subdir-makefiles)

textdetect / AndroID.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)OPENCV_PACKAGE_DIR:= /Users/danIElsIErraf/documents/OpenCV-2.4.10-androID-sdk/sdkOPENCV_CAMERA_MODulES := offinclude $(OPENCV_PACKAGE_DIR)/native/jnI/OpenCV.mkLOCAL_MODulE    := run_detectionLOCAL_SHARED_liBRARIES := libtessLOCAL_SRC_fileS := text_detect.cpp androID.cppLOCAL_LDliBS    += -landroID -llog -ldlinclude $(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响应之后,我回到了我的第一个设置并添加了与original Makefiles相同的LOCAL_EXPORT_C_INCLUDES(有几个变体使其适应我的路径),这解决了它.它找不到platform.h,因为它不知道在哪里寻找它.

现在,在我做了这个更改之后我遇到了一个不同的错误没有这样的文件或目录#include“com_Googlecode_tesseract_androID / src / API / baseAPI.h”我认为这是因为它没有在run_detection之前编译tesseract,而是依赖于它.那不是问题,它仍然在tesseract之前编译run_detection,但这不是问题,它是如此简单,我觉得因为花了这么多时间在这个错误上是如此愚蠢.问题是它找不到com_Googlecode_tesseract_androID / src / API / baseAPI.h,因为我没有提供相应的路径,所以我从tess-two复制了com_Googlecode_tesseract_androID和com_Googlecode_leptonica_androID,并将$(LOCAL_PATH)添加到LOCAL_EXPORT_C_INCLUDES.这是我的最终解决方案:

jni文件夹结构:

AndroID.mkApplication.mktext_detect.cppandroID.cpptext_detect.hcom_Googlecode_leptonica_androIDcom_Googlecode_tesseract_androID

AndroID.mk

LOCAL_PATH := $(call my-dir)#leptonicaLEPTONICA_LOCAL := $(LOCAL_PATH)/com_Googlecode_leptonica_androIDLEPTONICA_PATH := $(LEPTONICA_LOCAL)/srcinclude $(CLEAR_VARS)LOCAL_MODulE := libleptLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/liblept.soLOCAL_EXPORT_C_INCLUDES := \  $(LEPTONICA_LOCAL) \  $(LEPTONICA_PATH)/srcinclude $(PREBUILT_SHARED_liBRARY)#tesseractTESSERACT_LOCAL := $(LOCAL_PATH)/com_Googlecode_tesseract_androIDTESSERACT_PATH := $(TESSERACT_LOCAL)/srcinclude $(CLEAR_VARS)LOCAL_MODulE := libtessLOCAL_SRC_fileS := ../libs/$(TARGET_ARCH_ABI)/libtess.soLOCAL_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 := libleptinclude $(PREBUILT_SHARED_liBRARY)#opencvinclude $(CLEAR_VARS)OPENCV_PACKAGE_DIR:= /Users/danIElsIErraf/documents/OpenCV-2.4.10-androID-sdk/sdkOPENCV_CAMERA_MODulES := offinclude $(OPENCV_PACKAGE_DIR)/native/jnI/OpenCV.mkLOCAL_MODulE    := run_detectionLOCAL_SRC_fileS := text_detect.cpp androID.cppLOCAL_LDliBS    += -landroID -llog -ldlLOCAL_SHARED_liBRARIES += libtess libleptinclude $(BUILD_SHARED_liBRARY)
解决方法 你的最新设置是以一种奇怪的方式失败,ndk-build至少应该尝试编译你的模块.当在它之前定义了ndk模块时,all-subdir-makefiles中可能存在一个错误,并且它找不到你的模块的AndroID.mk.您可以尝试在顶级AndroID.mk中包含$(call all-subdir-makefiles).

无论如何,我认为你应该回到你的第一个设置,你的模块直接在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并使用相同的Application.mk而不是tess-two(复制`tess-two / jni / Application.mk).它已经正确定义了libtess和liblept模块.

总结

以上是内存溢出为你收集整理的将Tesseract和Opencv添加到Android.mk(Android Studio)全部内容,希望文章能够帮你解决将Tesseract和Opencv添加到Android.mk(Android Studio)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1125465.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存