Heribert
Heribert

Reputation: 613

NDK-build does not create .so files

I am trying to build a native library, called receiptrecognizer, which is called from an Android application.

I think I setup everything correctly, as NDK-build does not show any errors. However, when I call System.loadLibrary("receiptrecognizer"); I get an UnsatisfiedLinkError.

The reason for this is that there is no libreceiptrecognizer.so file within the apk. Actually there is no libreceiptrecognizer.so file created anywhere when I run ndk-build.

Why is no .so file generated?

receiptrecognizer uses openCV and tesseract (which in turn uses leptonica).

Here is my Android.mk:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)
    OPENCV_CAMERA_MODULES:=on
    OPENCV_INSTALL_MODULES:=on
    OPENCV_LIB_TYPE:=SHARED
    include ../opencv4android/sdk/native/jni/OpenCV.mk

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

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


    LOCAL_MODULE    := receiptrecognizer

    LOCAL_SRC_FILES := \
        src/OCRImagePreprocessor.cpp \
        src/util.cpp \
        ocrimagepreprocessorjni.cpp

    LOCAL_C_INCLUDES := \
      $(LOCAL_PATH)/../../opencv4android/sdk/native/jni/include \
      $(LOCAL_PATH)/../../tess-two/jni/com_googlecode_leptonica_android/src/src \
      $(LOCAL_PATH)/../../tess-two/jni/com_googlecode_tesseract_android/src \
      $(LOCAL_PATH)/../../tess-two/jni/com_googlecode_tesseract_android/src/ccutil \
      $(LOCAL_PATH)/../../tess-two/jni/com_googlecode_tesseract_android/src/ccstruct \
      $(LOCAL_PATH)/../../tess-two/jni/com_googlecode_tesseract_android/src/ccmain \
      $(LOCAL_PATH)/jni/src \
      $(LOCAL_PATH)/jni \
      $(LOCAL_PATH)/src \
      $(LOCAL_PATH)

    LOCAL_CFLAGS := \
      --std=c++11

    LOCAL_SHARED_LIBRARIES := \
        opencv_java3 \
        lept \
        tess

    include $(BUILD_SHARED_LIBRARY)

And here is the output of ndk-build(except for some warnings on overriding commands for target):

[armeabi] Prebuilt       : liblept.so <= jni/../../tess-two/libs/armeabi/
[armeabi] Install        : liblept.so => libs/armeabi/liblept.so
[armeabi] Prebuilt       : libopencv_java3.so <= ../opencv4android/sdk/native/jni/../libs/armeabi/
[armeabi] Install        : libopencv_java3.so => libs/armeabi/libopencv_java3.so
[armeabi] Compile++ thumb: receiptrecognizer <= OCRImagePreprocessor.cpp
[armeabi] Compile++ thumb: receiptrecognizer <= util.cpp
[armeabi] Compile++ thumb: receiptrecognizer <= ocrimagepreprocessorjni.cpp
make.exe: Circular obj/local/armeabi/libtess.so <- obj/local/armeabi/libtess.so dependency dropped.
[armeabi] Prebuilt       : libtess.so <= obj/local/armeabi/objs/receiptrecognizer/src/
[armeabi] Install        : libtess.so => libs/armeabi/libtess.so
[armeabi-v7a] Prebuilt       : liblept.so <= jni/../../tess-two/libs/armeabi-v7a/
[armeabi-v7a] Install        : liblept.so => libs/armeabi-v7a/liblept.so
[armeabi-v7a] Prebuilt       : libopencv_java3.so <= ../opencv4android/sdk/native/jni/../libs/armeabi-v7a/
[armeabi-v7a] Install        : libopencv_java3.so => libs/armeabi-v7a/libopencv_java3.so
[armeabi-v7a] Compile++ thumb: receiptrecognizer <= OCRImagePreprocessor.cpp
[armeabi-v7a] Compile++ thumb: receiptrecognizer <= util.cpp
[armeabi-v7a] Compile++ thumb: receiptrecognizer <= ocrimagepreprocessorjni.cpp
make.exe: Circular obj/local/armeabi-v7a/libtess.so <- obj/local/armeabi-v7a/libtess.so dependency dropped.
[armeabi-v7a] Prebuilt       : libtess.so <= obj/local/armeabi-v7a/objs/receiptrecognizer/src/
[armeabi-v7a] Install        : libtess.so => libs/armeabi-v7a/libtess.so
[x86] Prebuilt       : liblept.so <= jni/../../tess-two/libs/x86/
[x86] Install        : liblept.so => libs/x86/liblept.so
[x86] Prebuilt       : libopencv_java3.so <= ../opencv4android/sdk/native/jni/../libs/x86/
[x86] Install        : libopencv_java3.so => libs/x86/libopencv_java3.so
[x86] Compile++      : receiptrecognizer <= OCRImagePreprocessor.cpp
[x86] Compile++      : receiptrecognizer <= util.cpp
[x86] Compile++      : receiptrecognizer <= ocrimagepreprocessorjni.cpp
make.exe: Circular obj/local/x86/libtess.so <- obj/local/x86/libtess.so dependency dropped.
[x86] Prebuilt       : libtess.so <= obj/local/x86/objs/receiptrecognizer/src/
[x86] Install        : libtess.so => libs/x86/libtess.so
[mips] Prebuilt       : liblept.so <= jni/../../tess-two/libs/mips/
[mips] Install        : liblept.so => libs/mips/liblept.so
[mips] Prebuilt       : libopencv_java3.so <= ../opencv4android/sdk/native/jni/../libs/mips/
[mips] Install        : libopencv_java3.so => libs/mips/libopencv_java3.so
[mips] Compile++      : receiptrecognizer <= OCRImagePreprocessor.cpp
[mips] Compile++      : receiptrecognizer <= util.cpp
[mips] Compile++      : receiptrecognizer <= ocrimagepreprocessorjni.cpp
make.exe: Circular obj/local/mips/libtess.so <- obj/local/mips/libtess.so dependency dropped.
[mips] Prebuilt       : libtess.so <= obj/local/mips/objs/receiptrecognizer/src/
[mips] Install        : libtess.so => libs/mips/libtess.so

Any ideas are appreciated.

Upvotes: 1

Views: 1381

Answers (1)

sonic
sonic

Reputation: 1904

In the trace from ndk-build you show, i see this line make.exe: Circular obj/local/mips/libtess.so <- obj/local/mips/libtess.so dependency dropped.

I think this why you don't have the correct .so lib generated. I think you forget to add a include $(CLEAR_VARS) before LOCAL_MODULE := receiptrecognizer.

I hope this will be useful to you.

Upvotes: 1

Related Questions