opencv的android.mk,将Tesseract和Opencv添加到Android.mk(Android Studio)

博主在尝试将Tesseract和OpenCV库集成到Android.mk文件中时遇到平台头文件缺失和编译错误。通过调整预编译库设置、添加本地源文件和正确指定C包括路径,最终解决了编译问题。过程涉及查找头文件路径和共享库的正确安装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我按照

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 := 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)

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

新的jni文件夹结构:

Android.mk

Application.mk

text_detect/

Android.mk

android.cpp

text_detect.cpp

text_detect.h

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 $(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/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响应之后,我回到了我的第一个设置并添加了与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.mk

Application.mk

text_detect.cpp

android.cpp

text_detect.h

com_googlecode_leptonica_android

com_googlecode_tesseract_android

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值