我一直在尝试在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 ++源代码。
感谢。
答案 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
的正确方向。
如果仍然不够清楚,请在评论中告诉我或开始聊天,我会尝试进一步澄清这个答案。