使用Android Studio的CMake和NDK编译1个带有2个子库的库

时间:2018-01-30 17:36:45

标签: android c++ c cmake android-ndk

使用Android NDK项目。该项目正在使用CMake构建C ++库。

该库具有以下结构 -

  • 主图书馆
    • 的main.cpp
    • 的CMakeLists.txt
    • 你好(子库)/
      • 的CMakeLists.txt
      • 包括/
        • hello.h
      • 的src /
        • 的hello.c
    • 世界(子图书馆)/
      • 的CMakeLists.txt
      • 包括/
        • world.h
      • 的src /
        • world.c

内容如下:

的main.cpp

#include <jni.h>
#include <string>
#include <hello.h>
#include <world.h>

extern "C"
JNIEXPORT jstring

JNICALL
Java_com_test_myapplication_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string str = hello() + world();
    return env->NewStringUTF(str.c_str());
}

main.cpp的CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

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).
             src/main/cpp/native-lib.cpp )

 add_subdirectory(src/main/cpp/hello)
 include_directories(src/main/cpp/hello)
 add_subdirectory(src/main/cpp/world)
 include_directories(src/main/cpp/world)


target_link_libraries( # Specifies the target library.
                       native-lib
                        hello
                        world)

world.h

#include <string>

std::string world();

world.c

#include "world.h"

std::string world() {
    return std::string("world");
}

的CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project (world)

add_definitions(/DVERSION="0.4.0")

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Os")

include_directories(include/)

set(SOURCES
    src/world.c
    include/world.h
)


add_library(world STATIC IMPORTED
    ${SOURCES}
    )
target_include_directories(world PUBLIC ./)

&#34;你好&#34;的内容是相同的。库唯一的区别是hello函数返回的输出。

现在,我对CMake的体验几乎不存在,我无法让它发挥作用。我在构建它时经常遇到错误。最新的错误如下 -

  

src / main / cpp / hello / CMakeLists.txt中的CMake错误:19   (target_include_directories):无法为其指定包含目录   导入目标&#34;你好&#34;。 CMake错误   src / main / cpp / world / CMakeLists.txt:19(target_include_directories):
  无法为导入的目标&#34; world&#34;。

指定包含目录

我无法找到将所有内容编译成将在应用中使用的简单库的方法。有时我得到&#34;找不到&#34;,有时它无法找到头文件等。

如果有人能够发布一个简单的结构,并且因为我失去了正确的方式,那我就会知道。

在实际项目中,我尝试使用libmicrohttpd,但再一次,它不能使它工作。我尝试过使用CentOS的库,但Android Studio似乎使用了系统的库,导致事情搞砸了。这就是我下载库并尝试通过Android Studio编译它的原因。

所以,再次,如果有人能够找到一种方法将所有3个库一起编译成一个连接其他2个(hello,world)的库(main),我会非常熟悉它

非常熟悉。

0 个答案:

没有答案