2013-07-24 3 views
0

Hy!Скомпилируйте библиотеку JNI, которая содержит заголовки OpenCV

У меня есть проект Android с файлом cpp, который необходимо скомпилировать. Этот файл содержит некоторые заголовки библиотеки OpenCV. Исходные файлы OpenCV находятся в папке jni/include/opencv2, как вы можете видеть в файле Android.mk. Когда я пытаюсь скомпилировать с НДК-строить файл компилятор дает следующее сообщение об ошибке:

"undefined reference to" 

Это кажется, что это «ошибка: не определено ссылка на» проблема всех этих файлов.

Файл Android.mk имеют следующее содержание:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

OPENCV_PACKAGE_DIR := $(LOCAL_PATH)/include 

LOCAL_MODULE := iqindex 

LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH) \ 
    $(OPENCV_PACKAGE_DIR) 

LOCAL_SRC_FILES := \ 
    main.cpp 

LOCAL_SHARED_LIBRARIES := iqindex 

LOCAL_LDLIBS := -llog -lz 

include $(BUILD_SHARED_LIBRARY) 

У меня нет достаточного опыта работы с JNI/NDK вещи и мои вопросы:

  1. Чтобы скомпилировать файл .cpp для которого требуется еще один заголовочный файл, достаточно, чтобы скомпилировать его с помощью команды ndk-build, и все будет сделано?

  2. Что не так в моей попытке скомпилировать его? И что не так в Android.mk?

EDIT: Ошибка консоли следующее:

C:\MyName\My Project App>ndk-build 

C:/MyName/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml 
SharedLibrary : libiqindex.so 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o:(.ARM.extab.text.unlikely._ZL6jthrowP7_JNIEnv+0x2c): error: undefined reference to 'typeinfo for cv::Exception' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function cv::Mat::Mat(cv::Mat const&):jni/include/opencv2/core/mat.hpp:125: error: undefined reference to 'cv::Mat::copySize(cv::Mat const&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function cv::Mat::release():jni/include/opencv2/core/mat.hpp:364: error: undefined reference to 'cv::Mat::deallocate()' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function cv::Mat::~Mat():jni/include/opencv2/core/mat.hpp:278: error: undefined reference to 'cv::fastFree(void*)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Mat_submat_1n:jni/include/opencv2/core/mat.hpp:376: error: undefined reference to 'cv::Mat::Mat(cv::Mat const&, cv::Rect_<int> const&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Mat_resize_1n:jni/main.cpp:111: error: undefined reference to 'cv::_InputArray::_InputArray(cv::Mat const&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Mat_resize_1n:jni/main.cpp:111: error: undefined reference to 'cv::_OutputArray::_OutputArray(cv::Mat&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Mat_resize_1n:jni/main.cpp:111: error: undefined reference to 'cv::resize(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Utils_rotateData:jni/main.cpp:124: error: undefined reference to'cv::_InputArray::_InputArray(cv::Mat const&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Utils_rotateData:jni/main.cpp:124: error: undefined reference to'cv::_OutputArray::_OutputArray(cv::Mat&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Utils_rotateData:jni/main.cpp:124: error: undefined reference to'cv::flip(cv::_InputArray const&, cv::_OutputArray const&, int)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_Utils_rotateData:jni/main.cpp:125: error: undefined reference to'cv::Mat::t() const' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_IQLocal_nativeCreate:jni/main.cpp:139: error: undefined reference to 'get_instance()' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_IQLocal_load:jni/main.cpp:156: error: undefined reference to 'IQIndex::load(std::string, std::string)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_IQLocal_match:jni/main.cpp:171: error: undefined reference to 'IQIndex::match(cv::Mat&)' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_IQLocal_train:jni/main.cpp:182: error: undefined reference to 'IQIndex::train()' 

C:/MyName/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs/iqindex/main.o: in function Java_project_name_zxing_IQLocal_compute:jni/main.cpp:198: error: undefined reference to 'IQIndex::compute(cv::Mat const&, char const*, char const*)' 

collect2: ld returned 1 exit status 

make: *** [obj/local/armeabi-v7a/libiqindex.so] Error 1 

ВТОРОЙ EDIT: Теперь Android.mk выглядит следующим образом:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

# OpenCV 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 

include C:/Emil/downloads/OpenCV-2.4.6-android-sdk-r2/OpenCV-2.4.6-android-sdk/sdk /native/jni/OpenCV.mk 

LOCAL_MODULE := iqindex 

LOCAL_SRC_FILES := \ 
    main.cpp 

LOCAL_C_INCLUDES := \ 
    $(LOCAL_PATH)/iqindex.h 

LOCAL_LDLIBS := -llog -lz 

include $(BUILD_SHARED_LIBRARY) 
+0

Вы можете публиковать полную версию ошибки? Это похоже на ошибку компоновщика. – dudebrobro

ответ

2

Я полагаю, что вы забыли добавить OpenCV либрации вашего проекта. Поэтому линкер не может найти связанные с OpenCV функции.

From OpenCV documentation:

If your application project doesn’t have a JNI part, just copy the corresponding OpenCV native libs from /sdk/native/libs/ to your project directory to folder libs/.

In case of the application project with a JNI part, instead of manual libraries copying you need to modify your Android.mk file: add the following two code lines after the "include $(CLEAR_VARS)" and before "include path_to_OpenCV-2.4.6-android-sdk/sdk/native/jni/OpenCV.mk OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=on

Таким образом, вы должны иметь следующие строки в Android.mk:

include $(CLEAR_VARS) 
# OpenCV 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
include ../../sdk/native/jni/OpenCV.mk 
+0

Я сделал то, что вы написали здесь, и «неопределенная ссылка на« OpenCV »исчезла. Android.mk находится в позиции SECOND EDIT. Теперь у меня есть другая проблема: у меня в папке jni есть заголовочный файл с именем iqindex.h. Файл cpp включает его, но теперь у меня есть «неопределенная ссылка на» iqindex.h, когда я пытаюсь построить. Я попробовал команду LOCAL_C_INCLUDES в Android.mk, которая указывала на заголовочный файл, но затем он больше не видит openCV во время компиляции. Как включить этот заголовок, чтобы файлы были скомпилированы? –

+0

Ссылка была моей проблемой !! Я решил это после добавления этих зависимостей. – AnkitRox

+0

Иногда, в случае Android; упоминание «LOCAL_LDLIBS: = -lz -lm -llog -landroid -ldl» в Android.mk будет работать. – AnkitRox

1

Это поздно, но в ответ на:

Now I have another problem: I have in the jni folder a header file named iqindex.h . The cpp file includes it, but now I have "undefined reference to" iqindex.h when I try to build. I tried the LOCAL_C_INCLUDES command in Android.mk which pointed to the header file, but then it doesn't see openCV anymore at compile time. How do I include this header to make the files to compile ?

Проблема вероятно что вы использовали LOCAL_C_INCLUDES :=/foo/bar

Попробуйте LOCAL_C_INCLUDES +=/foo/bar. Вы должны добавить каталог include, а не перезаписывать существующие.

+0

важное примечание: 'LOCAL_C_INCLUDES' перечисляет каталоги, а не отдельные файлы include! –

Смежные вопросы