【问题标题】:Add headers and native library to Android project将标头和本机库添加到 Android 项目
【发布时间】:2019-11-26 09:13:38
【问题描述】:

我有一些 C 代码必须集成到我的 Android 项目中。它取决于一个库 (.so),我也有 .h 文件。

我将 libs 和 include 目录复制到项目的 cpp 包中,以便于查找。

为了方便起见,我尝试从 Android Studio 提供的 HelloJNI 项目开始,并按照说明进行操作 here

这是 CMakeLists.txt:

#given from HelloJNI
cmake_minimum_required(VERSION 3.4.1)

add_library(hello-jni SHARED
            hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      android
                      log)
#my own additions now:
add_library( # Specifies the name of the library.
        libgdndk

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        IMPORTED)
set_target_properties( # Specifies the target library.
        libgdndk

        # Specifies the parameter you want to define.
        PROPERTIES IMPORTED_LOCATION

        # Provides the path to the library you want to import.
        ${CMAKE_BINARY_DIR}/libs/${ANDROID_ABI}/libgdndk.so )
include_directories(${CMAKE_BINARY_DIR}/inc/)
target_link_libraries( hello-jni libgdndk app-glue ${libgdndk} )

这会导致错误:

ninja: error: 'libs/armeabi-v7a/libgdndk.so', needed by 'C:/workspace/android/HelloJNI/app/build/intermediates/cmake/arm7/debug/obj/armeabi-v7a/libhello-jni.so', missing and no known rule to make it

【问题讨论】:

    标签: android cmake ninja


    【解决方案1】:

    您似乎将导入的库链接到hello-jni 目标两次。此外,对于libgdndk 库,不需要在target_link_libraries() 命令中使用${}。您已经为库定义了一个 CMake 目标 libgdndk,所以您可以这样做:

    target_link_libraries( hello-jni libgdndk app-glue )
    

    【讨论】:

    • 感谢您的回复。我已将行更改为您建议的行,但仍然收到相同的错误消息。我是否必须删除或编辑其他任何内容?
    • 进行更改后,您是否清理了 CMake 缓存并从 scratch 运行 CMake?
    • 我其实不知道,我使用了“clear project”和“refresh linked c++ projects”,然后在 Android Studio 中使用了“Make project”。错误消息保持不变。
    • @slowcar 可以肯定的是,您可以删除 CMake 构建文件夹(包含 CMakeCache.txt 文件)。
    • 我找到了文件并删除了它,不幸的是没有改变任何东西。也许我会尝试在 Github 上找到一个包含外部库的项目。或者也许我有一段时间从供应商那里得到一个工作样本......
    【解决方案2】:

    我终于从 lib 的发布者那里得到了一些帮助,(工作)结果看起来与我尝试的代码非常相似,所以可能只是库的位置有问题。

    add_library( gdndk SHARED IMPORTED )
    include_directories( $ENV{userprofile}/AppData/Local/Android/sdk/extras/blackberry/dynamics_sdk/sdk/libs/handheld/gd/inc)
    set_target_properties(gdndk PROPERTIES IMPORTED_LOCATION $ENV{userprofile}/AppData/Local/Android/sdk/extras/blackberry/dynamics_sdk/sdk/libs/handheld/gd/libs/${ANDROID_ABI}/libgdndk.so )
    target_link_libraries( hello-jni gdndk )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2016-09-29
      • 2012-01-05
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多