如何通过CMake向C/C++ JNI项目添加外部库

问题描述 投票:0回答:1

我正在 Android Studio 中处理一个 Android-C 库项目。我需要将 C 等外部库直接添加到我的项目中(而不是通过 Android Studio Gradle 依赖项)。

我已经通过自制软件安装了 OpenSSL 3,并在我的 .zprofile 中设置了 OPENSSL_ROOT_DIR。但是,当我尝试构建该项目时,我遇到了以下错误


C++ build system [configure] failed while executing:
    /opt/homebrew/bin/cmake \
      -H/Users/mba/AndroidStudioProjects/MyApplication/app/src/main/cpp \
      -DCMAKE_SYSTEM_NAME=Android \
      -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
      -DCMAKE_SYSTEM_VERSION=24 \
      -DANDROID_PLATFORM=android-24 \
      -DANDROID_ABI=arm64-v8a \
      -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
      -DANDROID_NDK=/Users/mba/Library/Android/sdk/ndk/25.1.8937393 \
      -DCMAKE_ANDROID_NDK=/Users/mba/Library/Android/sdk/ndk/25.1.8937393 \
      -DCMAKE_TOOLCHAIN_FILE=/Users/mba/Library/Android/sdk/ndk/25.1.8937393/build/cmake/android.toolchain.cmake \
      -DCMAKE_MAKE_PROGRAM=/Users/mba/Library/Android/sdk/cmake/3.22.1/bin/ninja \
      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/mba/AndroidStudioProjects/MyApplication/app/build/intermediates/cxx/Debug/444d406q/obj/arm64-v8a \
      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/mba/AndroidStudioProjects/MyApplication/app/build/intermediates/cxx/Debug/444d406q/obj/arm64-v8a \
      -DCMAKE_BUILD_TYPE=Debug \
      -DCMAKE_FIND_ROOT_PATH=/Users/mba/AndroidStudioProjects/MyApplication/app/.cxx/Debug/444d406q/prefab/arm64-v8a/prefab \
      -B/Users/mba/AndroidStudioProjects/MyApplication/app/.cxx/Debug/444d406q/arm64-v8a \
      -GNinja \
      -DANDROID_STL=c++_shared
  from /Users/mba/AndroidStudioProjects/MyApplication/app
CMake Error at /opt/homebrew/Cellar/cmake/3.29.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY
  OPENSSL_INCLUDE_DIR)

我的CMakeLists.txt

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.

# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)

project("nfcNative")

find_package(OpenSSL REQUIRED)
message(STATUS "OPENSSL_LIBRARIES:${OPENSSL_LIBRARIES}")

add_library(${CMAKE_PROJECT_NAME} SHARED
        nfcNative.c
        commands.c
        rsa.c
        )

include_directories(src/main/cpp/include/ ${OPENSSL_INCLUDE_DIRS})
target_link_libraries(${CMAKE_PROJECT_NAME}
        android
        log
        OpenSSL::Crypto
        OpenSSL::Ssl
        )

我在以下位置设置了 OPENSSL_ROOT_DIR 但编译器仍然找不到它

enter image description here

此外,我还可以找到通过 Android studio 依赖项添加的包

find_package(openssl REQUIRED CONFIG)

但是,提供的包(com.android.ndk.thirdparty:openssl:1.1.1q-beta-1只是版本1.1.1,我的项目需要更新的版本3.x

android c cmake openssl java-native-interface
1个回答
0
投票

将预构建库文件放入

src/main/jniLibs/[abi]
中,如此处所述。之后,您可以使用
find_library
target_link_libraries
进行链接。

预构建最新版本的 OpenSSL 已存档此处。请注意,此存档提供静态版本。

© www.soinside.com 2019 - 2024. All rights reserved.