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

How to Build/Debug Android Studio External Source Library?

本文关键字:Studio Android 外部 调试 何构建 构建      更新时间:2023-10-16

我一直试图在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++源代码。

谢谢。

通常,我建议使用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文件假定它是构建的顶层,因此,如果没有您的一些黑客行为,这种方法将无法工作(问题是它在其顶层CMakeLists.txt文件中使用CMAKE_SOURCE_DIR)。另一种选择可能是使用ExternalProject。这虽然不太方便,但更灵活,因为它允许你从任何类型的外部项目引入构建,在它们自己的沙盒中构建这些项目,然后你的主构建用于链接,等等。它还有一个优点,它可以为您下载mapbox的源代码,因此您不必将其直接添加到您自己的项目源代码中。与其在这里重复,我建议您参考以下链接,了解现有的问题和答案,这些问题和答案应该为您指明使用ExternalProject的正确方向。

  • 一个相当简单的例子,带有一些有用的注释
  • Kitware关于如何使用ExternalProject的博客文章(链接归功于此答案)
  • 一系列关于使用GoogleTest的答案,这些答案可能会激发一些想法,并突出一些需要注意的事情(检查所有答案,而不仅仅是评分最高的)。

如果这还不够清楚,请在评论中告诉我,或者开始聊天,我会尽量为你进一步澄清这个答案。