如何构建/调试Android Studio外部源库?

时间:2016-10-02 23:08:32

标签: c++ android-studio makefile cmake mapbox-gl

我一直在尝试在Android Studio 2.2中构建和调试外部Java / C ++源代码库,但我无法弄清楚如何执行此操作或是否可行。

具体来说,我试图使用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中引用库CMakeLists.txt或Mapbox源中的Makefile。希望它构建的库可以调试。或者,将它静态链接也是可以接受的,只要我可以调试到库中的C ++源代码。

感谢。

1 个答案:

答案 0 :(得分: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文件假定它是构建的顶层,因此如果没有一些hackery,这种方法将无法工作(问题在于它使用了CMAKE_SOURCE_DIR它的顶级CMakeLists.txt文件。另一种方法是使用ExternalProject代替。这不太方便,但更灵活,因为它允许您从几乎任何类型的外部项目引入构建,在您自己的沙箱中构建此类项目,然后您的主要构建用于链接等。它还具有以下优势:我们也可以为您下载mapbox的源代码,因此您无需将其直接添加到您自己项目的源代码中。我不会在这里重复所有内容,而是将您引用以下链接以获取现有问题和答案,这些链接应指向您使用ExternalProject的正确方向。

如果仍然不够清楚,请在评论中告诉我或开始聊天,我会尝试进一步澄清这个答案。