我正在这样编写一个gradle库:
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "../../JRTPLIB/CMakeLists.txt"
}
}
我需要编译另一个源代码,可能使用cmake或任何其他工具,也在gradle中,它将从上面的lib(JRTPLIB)链接到编译对象。
显而易见的方法是将上面的库的源包含在我想要使用的lib中,并且只是链接,但我需要分开进行。
另一种方法是依赖于android/app/build/intermediates/cmake/...
生成的库对象,但首先,它应该在此文件夹中有一个调试二进制文件和一个版本,这使得链接更加复杂,其次,它不是一个优雅的解决方案。
那怎么办呢?
答案 0 :(得分:1)
这是一个简单的例子,可以完成我认为你想做的事情。
正在构建两个库并将其打包到应用程序中,其中第二个库依赖于第一个库。我选择将lib1和lib2作为当前项目的一部分,但它们可以真正位于任何地方。
应用/的CMakeLists.txt 强>
cmake_minimum_required(VERSION 3.4.1)
add_subdirectory(src/main/cpp/lib1)
add_subdirectory(src/main/cpp/lib2)
应用/ SRC /主/ CPP / LIB1 /的CMakeLists.txt 强>
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib1
SHARED
native-lib1.cpp )
target_include_directories(native-lib1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
应用/ SRC /主/ CPP / LIB2 /的CMakeLists.txt 强>
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib2
SHARED
native-lib2.cpp )
find_library(log-lib log)
# native-lib2 depends on log and native-lib1
target_link_libraries(native-lib2 ${log-lib} native-lib1)
应用/ SRC /主/ CPP / LIB1 /天然-lib1.h 强>
#pragma once
int foo();
应用/ SRC /主/ CPP / LIB1 /天然-lib1.cpp 强>
#include "native-lib1.h"
int foo()
{
return 42;
}
应用/ SRC /主/ CPP / LIB2 /天然-lib2.cpp 强>
#include <jni.h>
#include <android/log.h>
#include <string>
#include "native-lib1.h"
extern "C" JNIEXPORT jstring JNICALL Java_com_example_cmaketwolibs_MainActivity_stringFromJNI(
JNIEnv *env, jobject thiz) {
// Call function from native-lib1
__android_log_print(ANDROID_LOG_WARN,
"native-lib2", "Calling native-lib1\'s foo(): %d",
foo());
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}