ndk-build неопределенная ошибка ссылки

Я использую ndk-build для создания набора общих библиотек (.so) для моего проекта Android. Я настроил и сделал исходный код библиотеки C++ (gdal-2.2.2). все было в порядке. ("/configure & make & make install" выполнено успешно).

Итак, я создал свою папку jni, как в этой документации.

но когда я пытаюсь использовать ndk-build в Windows, я получаю много ошибок, таких как «Неопределенная ссылка на что-то».

Я потратил много времени на этот проект. Есть ли кто-нибудь, кто может мне помочь? Спасибо.

Обновить

Я использовал такую ​​​​конфигурацию в Ubuntu 16.04:

./configure --prefix=/home/mahdi/Desktop/build/ --with-spatialite=yes --with-spatialite-soname=libspatialite.so --host=i686-linux-android  CXXFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" LIBS="-lsupc++ -lstdc++"

После шага make & make install я создал JNI. это мой каталог.

jniwrap
jni
  gdal
  Android.mk
  Application.mk
  gdal_wrap.cpp
  gdalconst_wrap.c  
  gnm_wrap.cpp  
  libgdal.a 
  ogr_wrap.cpp
  osr_wrap.cpp

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdaljni
LOCAL_SRC_FILES := gdal_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdalconstjni
LOCAL_SRC_FILES := gdalconst_wrap.c
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ogrjni
LOCAL_SRC_FILES := ogr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := osrjni
LOCAL_SRC_FILES := osr_wrap.cpp
LOCAL_STATIC_LIBRARIES := gdal
include $(BUILD_SHARED_LIBRARY)

Приложение.mk

APP_STL := gnustl_shared
APP_CFLAGS := Android.mk
APP_ABI := x86
APP_PLATFORM := android-14

Затем я использовал android-ndk-r16b в windows-x86_64, но столкнулся с такими ошибками, как на этой картинке:

неопределенная ссылка...

Было много «ошибок неопределенной ссылки», которые я не могу здесь показать.

Примечание: для создания привязки Java gdal я использовал swig и jdk7 на своей Ubuntu 16.04.


person Mahdi Nazari    schedule 03.05.2018    source источник
comment
Приведите минимальный пример вместе с результирующими сообщениями об ошибках.   -  person Michael    schedule 03.05.2018
comment
Обратите внимание, что в этом проекте использовался NDK r7. Скорее всего, эти инструкции уже не актуальны с современными NDK (r16). Иногда установка более старой версии NDK (например, r10 с сайта developer.android.com/ndk/downloads/older_releases) может помочь. В противном случае предоставьте дополнительную информацию: какие неопределенные ссылки, какие шаги были выполнены успешно и т. д. Раскройте все параметры для ./configure — здесь очень легко ошибиться.   -  person Alex Cohn    schedule 03.05.2018
comment
@AlexCohn Пожалуйста, прочитайте данное обновление.   -  person Mahdi Nazari    schedule 04.05.2018
comment
Посмотрите, не является ли это вашей проблемой stackoverflow.com/questions/4585591/no-rule-to-make-target-ndk/   -  person Marcos Vasconcelos    schedule 04.05.2018
comment
забавный факт о вашей установке заключается в том, что ответвление gdal объясняет, как собрать библиотеку для Android (github.com/nutiteq /gdal) не содержит ogrsqliteapiroutines.c файла, вызвавшего неопределенные ссылки на sqlite3_bind_… функции. Могло ли случиться так, что вы смешали разные версии? Почему бы вам не запустить шаг ndk на той же машине с Ubuntu? Переход на Windows — еще одна проблема в вашей настройке. Безопаснее скопировать полученные библиотеки JNI в Windows, если вы предпочитаете работать с Android Studio на этой платформе.   -  person Alex Cohn    schedule 04.05.2018
comment
@AlexCohn Я хотел сделать это на той же машине с Ubuntu, но получил другую ошибку на Ubuntu, поэтому решил перейти на Windows.   -  person Mahdi Nazari    schedule 04.05.2018
comment
@AlexCohn Я использовал этот репозиторий в Windows, и он работал хорошо, но мой проект терпит неудачу.   -  person Mahdi Nazari    schedule 04.05.2018
comment
Но это 2.1.4! Вот почему он не соответствует вашему 2.2.2   -  person Alex Cohn    schedule 04.05.2018
comment
@AlexCohn да. Я должен собрать 2.1.4 для себя и сравнить это с репозиторием abow. Но я думаю, что я не делаю настройку по-настоящему. Или я думаю, что мне нужна зависимость. Можно ли с тобой поболтать. Спасибо за вашу помощь.   -  person Mahdi Nazari    schedule 04.05.2018


Ответы (1)


Когда вы собираете libgdal.a на своем компьютере с Ubuntu, у вас должен быть sqlite3, который разрешает #include "sqlite3.h".

Этих подключаемых файлов достаточно для статической библиотеки, но для создания libgdaljni.so вам также потребуется libsqlite3.a. Вы можете кросс-компилировать его для Android самостоятельно на том же компьютере с Ubuntu, но, вероятно, можно получить предварительно собранную библиотеку, например. с https://github.com/couchbase/couchbase-lite-java-native/tree/master/vendor/sqlite/libs/android.

Скопируйте этот файл (для соответствующего ABI) в тот же каталог и соответствующим образом измените файл Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := sqlite3
LOCAL_SRC_FILES := libsqlite3.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := gdal
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/gdal/include
LOCAL_SRC_FILES := libgdal.a
LOCAL_EXPORT_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := sqlite3
include $(PREBUILT_STATIC_LIBRARY)

*continued without changes*

Если у вас все еще есть «ошибка неопределенной ссылки», это может означать, что необходимо добавить некоторые другие библиотеки.

person Alex Cohn    schedule 08.05.2018
comment
Спасибо большое. Он работал нормально, и ошибки sqlite3 пошли. но есть и другие справочные ошибки, которые я не могу найти, как их разрешить. Неопределенная ссылка на std::__CXX11::basic_string. Вы знаете, как я должен решить это? - person Mahdi Nazari; 08.05.2018
comment
Есть проблема, других ошибок Undefined refrence очень много. Должен ли я решить их, как вы сказали? - person Mahdi Nazari; 08.05.2018
comment
Не все ошибки неопределенных ссылок можно решить одним и тем же способом. Например. этот std::__CXX11::basic_string — из какого файла он берется? - person Alex Cohn; 09.05.2018
comment
/usr/include/c++/5/bits/basic_string.h:589 errorL неопределенная ссылка на 'std::__cxx11::__cxx11::basic_string‹char, std::char_traits‹char›,std::allocator‹char›› ::обмен... - person Mahdi Nazari; 09.05.2018
comment
Это происходит из-за какого-то модуля, который не был создан для Android. В сообщении об ошибке не упоминается какой-либо файл .a или .o? - person Alex Cohn; 09.05.2018
comment
Я не понимаю, что ты имеешь в виду. У меня также есть, например, эта ошибка, неопределенная ссылка на 'json_object_new_array', это изображение показывает мои ошибки imgur.com/a/wRSXOqK - person Mahdi Nazari; 24.05.2018
comment
На вашем скриншоте видно, что gdalwarpoperation.cpp несет ответственность, по крайней мере, за часть этих ошибок. А также то, что он не был скомпилирован с помощью набора инструментов Android (NDK). Мы можем немного лучше понять ситуацию, если вы запустите ndk-build V=1, он покажет полные команды сборки по мере их выполнения. - person Alex Cohn; 24.05.2018