Как создать / отладить внешнюю исходную библиотеку Android Studio?

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

В частности, я пытаюсь использовать 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());
}

Он также создает app / CMakeLists.txt-файл.

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

Причина, по которой я думаю, что это может быть правильным путем, заключается в том, что мастер создал app/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++ в библиотеке.

Спасибо.

1 ответ

  1. Обычно я бы предложил использовать 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)
    

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

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