Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android cmake different abi

Im using prebuilt android native library: libcrypto.a. Library is compiled for armeabi, armeabi-v7a and x86. Structure:

-app
  - CMakeLists.txt
  - libs
    - armeabi
    - armeabi-v7a
    - x86

Each folder (armeabi, armeabi-v7a and x86) contains folders lib(contains libcrypto.a) and include (contains header files). CMake code:

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_library(crypto STATIC IMPORTED)
set_target_properties(crypto
  PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/lib/libcrypto.a)

target_link_libraries( # Specifies the target library.
                       native-lib
                       crypto
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib})

In my own native-lib i wanna use libcrypto.a. But when i wanna import header file f.e. #include "openssl/md5.h" android studio does not see that file. And offer me to include one of THREE files from different abis:

"../../../libs/x86/include/openssl/md5.h"
"../../../libs/armeabi/include/openssl/md5.h"
"../../../libs/armeabi-v7a/include/openssl/md5.h"

Is there any way to create one version of my library (native-lib), include only 1 header and let android studio to choose abi automatically?

Smth like:

#include "openssl/md5.h"

but in the same time use 3 abi version. Or i should use prebuilt included libraries not like that?

#EDIT1

target_include_directories(crypto INTERFACE ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include)

Not working, getting CMake error.

Before that i have used

target_include_directories(${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include/)
like image 298
TooLazy Avatar asked Apr 21 '26 01:04

TooLazy


1 Answers

You need to add an include directory so that the compiler can find openssl/md5.h.

The most idiomatic way to do this would be:

target_include_directories(crypto INTERFACE
    ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include)

Unfortunately, CMake is silly, and doesn't actually let you do this yet on imported library targets, so you have to set the property manually, like so:

set_target_properties(crypto
    PROPERTIES
    IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/lib/libcrypto.a
    INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include
)

That adds that include directory to the interface of crypto, which means it also gets used when building native-lib, as properties which are preceded with INTERFACE are propagated to the users of that target. Using INTERFACE properties is the natural way in CMake to propagate usage requirements to consumers of a library.

like image 81
aiusepsi Avatar answered Apr 23 '26 15:04

aiusepsi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!