Как собрать / отладить библиотеку внешних источников 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 ++ в библиотеке.

Благодарю.

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)

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]