在NDK w / gradle上编译两个项目,其中一个项目取决于其他二进制文件

时间:2018-04-25 01:42:40

标签: android c++ cmake android-ndk

我正在这样编写一个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/...生成的库对象,但首先,它应该在此文件夹中有一个调试二进制文件和一个版本,这使得链接更加复杂,其次,它不是一个优雅的解决方案。

那怎么办呢?

1 个答案:

答案 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());
}