Я пытался собрать и отладить внешнюю исходную библиотеку 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 ++ в библиотеке.
Благодарю.
Обычно я бы предложил использовать 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
,
Если это все еще недостаточно ясно, дайте мне знать в комментариях или начните чат, и я постараюсь прояснить этот ответ для вас.
Других решений пока нет …