user1914692
user1914692

Reputation: 3073

How to include only necessary OpenCV libraries in Android?

I am using OpenCV through JNI in my Android application. The libopencv_java.so is too big, about 7M. Apparently, I only need a few libraries. I check the libs in OpenCV4Android, finding out some static libraries, such as libopencv_core.a Here is my new code in Android.mk to include necessary OpenCV libraries. And I include libopencv_core.a, libopencv_highgui.a, libopencv_imgproc.a, and some 3rd party libraries, which are: liblibjasper.a, liblibjpeg.a, liblibpng.a, liblibtiff.a

include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_highgui_prebuilt
LOCAL_SRC_FILES := libopencv_highgui.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_imgproc_prebuilt
LOCAL_SRC_FILES := libopencv_imgproc.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libopencv_core_prebuilt
LOCAL_SRC_FILES := libopencv_core.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := liblibjpeg_prebuilt
LOCAL_SRC_FILES := liblibjpeg.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := liblibpng_prebuilt
LOCAL_SRC_FILES := liblibpng.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := liblibtiff_prebuilt
LOCAL_SRC_FILES := liblibtiff.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := liblibjasper_prebuilt
LOCAL_SRC_FILES := liblibjasper.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/OpenCV242AndroidSDKNativeJNI/include
include $(PREBUILT_STATIC_LIBRARY)



include $(CLEAR_VARS)
LOCAL_MODULE    := native_jni
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_CFLAGS += -fpermissive

LOCAL_STATIC_LIBRARIES += libopencv_highgui_prebuilt
LOCAL_STATIC_LIBRARIES += libopencv_imgproc_prebuilt
LOCAL_STATIC_LIBRARIES += libopencv_core_prebuilt
LOCAL_STATIC_LIBRARIES += liblibjpeg_prebuilt
LOCAL_STATIC_LIBRARIES += liblibpng_prebuilt
LOCAL_STATIC_LIBRARIES += liblibtiff_prebuilt
LOCAL_STATIC_LIBRARIES += liblibjasper_prebuilt

LOCAL_LDLIBS +=  -llog -ldl
LOCAL_LDLIBS += -ljnigraphics
LOCAL_LDLIBS += -lz

include $(BUILD_SHARED_LIBRARY)

But it does not go through compiling. A long error list, all related to assertion fail:

/usr/src/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: BFD (GNU Binutils) 2.21 assertion fail /usr/local/google/home/andrewhsieh/ndk-andrewhsieh/src/build/../binutils/binutils-2.21/bfd/elf32-arm.c:10190
Install        : libnative_jni.so => libs/armeabi-v7a/libnative_jni.so
/usr/src/android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6.x-google/../../../../arm-linux-androideabi/bin/ld: BFD (GNU Binutils) 2.21 assertion fail /usr/local/google/home/andrewhsieh/ndk-andrewhsieh/src/build/../binutils/binutils-2.21/bfd/elf32-arm.c:10190

I also tried to change the order of these static libraries; but it does not work. Any suggestion?

Upvotes: 7

Views: 1315

Answers (1)

Adi Shavit
Adi Shavit

Reputation: 17285

Static library linking will only pull in the functionality you actually use in your code instead of the whole lib as in a .so.
Look at the OpenCV Android sample projects to see how to use static linking.

Upvotes: 0

Related Questions