2016-10-02 4 views
0

Я пытаюсь создать и отладить внешнюю исходную библиотеку Java/C++ внутри Android Studio 2.2, но я не могу понять, как это сделать или если это возможно.Как создавать/отлаживать внешнюю библиотеку Android Studio?

В частности, я пытаюсь использовать библиотеку https://github.com/mapbox/mapbox-gl-native, но я подозреваю, что решение может быть похоже на любую библиотеку Java/C++. В этом случае библиотека содержит файл Makefile и CMakeLists.txt.

Я не видел, как используется CMakeLists.txt, но я построил библиотеку MapBox из источника с помощью команды:

BUILDTYPE=Debug make android 

Я создал проект с помощью мастера Android Studio и выбрал C++ вариант, который создает образец .cpp, который успешно строит и отлаживает:

// native-lib.cpp 

#include <jni.h> 
#include <string> 

extern "C" 
jstring 
Java_com_example_kea_mapboxtest_MainActivity_stringFromJNI(
     JNIEnv* env, 
     jobject /* this */) { 
    std::string hello = "Hello from C++"; 
    return env->NewStringUTF(hello.c_str()); 
} 

Он также создать файл приложения/CMakeLists.txt.

Я все равно ищу и могу отлаживать стороннюю библиотеку исходных текстов C++. Мое лучшее предположение заключается в том, что есть способ изменить файл app/CMakeLists.txt, созданный мастером, для этого, но я предполагаю, что это то, что нужно делать, и я не могу понять, как это сделать.

Причина, я думаю, что это может быть правильный путь, чтобы принять то, что мастер генерируется приложение/CMakeLists.txt содержит:

# Creates and names a library, sets it as either STATIC 
# or SHARED, and provides the relative paths to its source code. 
# You can define multiple libraries, and CMake builds it for you. 
# Gradle automatically packages shared libraries with your APK. 

    add_library(# Sets the name of the library. 
       native-lib 

       # Sets the library as a shared library. 
       SHARED 

       # Provides a relative path to your source file(s). 
       # Associated headers in the same location as their source 
       # file are automatically included. 
       src/main/cpp/native-lib.cpp 

, который, кажется, работает. Я думал, что возможно было бы ссылаться на библиотеку CMakeLists.txt или Makefile, найденную в источнике Mapbox внутри созданного мастером CMakeLists.txt. Надеюсь, что библиотека, которую он построит, будет отлаживаемой. Альтернативно, статическая связь также была бы приемлемой, если бы я мог отлаживать исходный код C++ в библиотеке.

Спасибо.

ответ

0

Обычно я предлагаю использовать add_subdirectory() сначала принести карту окно в сборку, а затем target_link_libraries() связать свою native-lib цель на него, что-то вроде этого:

add_subdirectory(path/to/mapbox/src mapbox) 
add_library(native-lib SHARED src/main/cop/native-lib.cpp) 
target_link_libraries(native-lib PUBLIC mbgl-core) 

К сожалению, CMakeLists.txt файл в MapBox проекта предполагает это верхний уровень сборки, поэтому подход не будет работать без какой-либо взлома с вашей стороны (проблема в том, что он использует CMAKE_SOURCE_DIR в своем верхнем уровне CMakeLists.txt файл). Альтернативой может быть использование вместо ExternalProject. Это менее удобно, но более гибко, поскольку позволяет создавать встроенные сборки практически из любого внешнего проекта, создавая такие проекты в собственной песочнице, которую ваша основная сборка использует для связи и т. Д. Это также имеет то преимущество, что может позаботиться о том, чтобы загрузить источник для mapbox для вас тоже, поэтому вам не нужно добавлять его непосредственно в источники своего собственного проекта. Вместо того, чтобы повторять все здесь, я расскажу вам следующие ссылки на существующие вопросы и ответы, которые должны указывать вам в правильном направлении для использования ExternalProject.

Если это еще недостаточно ясно, сообщите мне в комментариях или запустите чат, и я попытаюсь разъяснить этот ответ дальше для вас.

+0

Thanks Craig. Я совершенно не знаком с CMake. Я заказал книгу, чтобы посмотреть, поможет ли она, но это через несколько недель после прибытия. Я не нахожу много онлайн и даже меньше в отношении отладки в Android Studio. Чтобы уточнить OP, я создал библиотеку с помощью Make и создал проект, используя его, но отладчик не пойдет на C++, поэтому я не уверен, что даже если бы я понял ваше сообщение, что он разрешил бы проблему после прочитав ссылки, которые вы отправили. Приятно, что обновление библиотеки, но отладка с AS действительно проблема. Позвольте мне прочитать больше, а затем я отведу вас в предложение чата. – Mitch

+0

Хорошо, я сделал несколько попыток, но все ничего не делает, или в некоторых случаях сбой Android Studio. Чем больше я смотрю на ваше предложение, тем меньше я думаю, что это сработает. Причина в том, что, похоже, ваша «песочница» все равно потеряет информацию об отладке. Конечно, будучи совершенно новым, я просто догадываюсь об этом. Я был бы рад, если бы вы подумали, что это может привести к связыванию. Мне понадобится дополнительная помощь в понимании команд CMake для продолжения. Благодарю. – Mitch

+0

Обсуждение перемещено в чат [здесь] (http://chat.stackoverflow.com/rooms/124759/cmake-and-mapbox-issue) –

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

  • Нет связанных вопросов^_^