代码之家  ›  专栏  ›  技术社区  ›  PPP

在NDK和gradle上编译两个项目,其中一个依赖于另一个的二进制文件

  •  0
  • PPP  · 技术社区  · 6 年前

    我在gradle编译一个库,如下所示:

    externalNativeBuild {
    
            // Encapsulates your CMake build configurations.
            cmake {
                // Provides a relative path to your CMake build script.
                path "../../JRTPLIB/CMakeLists.txt"
            }
        }
    

    我需要编译另一个源代码,可能使用cmake或任何其他工具,也在gradle内部,它将从上面的库(JRTPLIB)链接到已编译的对象。

    最明显的方法是将上面库的源代码包含在我想要使用的库中并进行链接,但我需要单独完成。

    另一种方法是依赖于 android/app/build/intermediates/cmake/... 但首先,它应该在这个文件夹中有一个调试二进制文件和一个发布二进制文件,使链接更加复杂,其次,它不是一个优雅的解决方案。

    那么怎么做呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Michael    6 年前

    这里有一个简单的例子,它完成了我认为您正在尝试的事情。

    两个库正在构建并打包到应用程序中,其中第二个库依赖于第一个库。我选择将lib1和lib2作为当前项目的一部分,但它们确实可以位于任何地方。

    应用程序/CMakeLists。txt文件

    cmake_minimum_required(VERSION 3.4.1)
    
    add_subdirectory(src/main/cpp/lib1)
    add_subdirectory(src/main/cpp/lib2)
    

    app/src/main/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})
    

    app/src/main/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)
    

    app/src/main/cpp/lib1/native-lib1。H

    #pragma once
    
    int foo();
    

    app/src/main/cpp/lib1/native-lib1。cpp公司

    #include "native-lib1.h"
    
    int foo()
    {
        return 42;
    }
    

    app/src/main/cpp/lib2/native-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());
    }