1. Android NDK( Native Development Kit )
Android NDK 是一个工具集,可让您使用 C 和 C++ 等语言以原生代码实现应用的各个部分。对于特定类型的应用,这可以帮助您重复使用以这些语言编写的代码库。
就是包含运行其他语言的工具。
2. find_library
Android 平台上已存在预构建的 NDK 库,因此您无需构建它们或将它们打包到 APK 中。由于这些 NDK 库已位于 CMake 搜索路径中,因此您甚至无需指定本地安装的 NDK 库的位置,您只需为 CMake 提供您想要使用的库的名称,并将其与您自己的原生库相关联即可。
向 CMake 构建脚本添加find_library()
命令以找到 NDK 库并将其路径存储为一个变量。您可以使用此变量在构建脚本的其他部分引用 NDK 库。以下示例可以找到 Android 专有的日志支持库,并会将其路径存储在log-lib
中:
find_library( # Defines the name of the path variable that stores the
# location of the NDK library.
log-lib
# Specifies the name of the NDK library that
# CMake needs to locate.
log )
就是直接把NDK内置的包拿来用,比如找到log
包并且命名为log-lib
3. add_library
以源代码的形式包含一些库,您将需要构建这些代码并将其关联到您的原生库。您可以使用 CMake 构建脚本中的
add_library()
命令将源代码编译到原生库中。要提供本地 NDK 库的路径,您可以使用 Android Studio 自动为您定义的ANDROID_NDK
路径变量。
以下命令告诉 CMake 要编译android_native_app_glue.c
(负责管理NativeActivity
生命周期事件和触摸输入),并将其链接到静态库native-lib
中:
add_library( app-glue
STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c )
# You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )
4. IMPORTED
添加预构建库的步骤与为 CMake 指定其他要构建的原生库的步骤相似。不过,由于库已构建,因此您需要使用
IMPORTED
标记告诉 CMake 您只想要将此库导入到您的项目中。
add_library( imported-lib
SHARED
IMPORTED )
5. set_target_properties
然后,您需要使用
set_target_properties()
命令指定库的路径,具体步骤如下所示。
某些库会针对特定的 CPU 架构或应用二进制接口 (ABI) 提供单独的软件包,并将其整理到单独的目录中。此方法既有助于库充分利用特定的 CPU 架构,又能让您只使用所需的库版本。要向 CMake 构建脚本添加库的多个 ABI 版本,而不必为库的每个版本编写多个命令,您可以使用ANDROID_ABI
路径变量。此变量使用的是 NDK 支持的一组默认 ABI,或者您手动配置 Gradle 以使用的一组经过过滤的 ABI。例如:
add_library(...)
set_target_properties( # Specifies the target library.
imported-lib
# Specifies the parameter you want to define.
PROPERTIES IMPORTED_LOCATION
# Provides the path to the library you want to import.
imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
就是说如果你要包含的不是C代码(源文件),而是lib包,那么就要add后这么指定,否则就直接add源文件就行。
6. target_link_libraries
为了让您的原生库能够调用
log
库中的函数,您需要使用 CMake 构建脚本中的target_link_libraries()
命令来关联这些库:
find_library(...)
# Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
native-lib
# Links the log library to the target library.
${log-lib} )
就是之前add
的和find
的library都要在这里包含进去才能用,find
的库需要根据名称添加${}
取到地址。
网友评论