FindJNI¶
查找 Java 本地接口 (JNI) 的包含目录和库
find_package(JNI [<version>] [COMPONENTS <components>...] [...])
JNI 使运行在 Android 上的 Java 虚拟机 (JVM) 或 Dalvik 虚拟机 (DVM) 中的 Java 代码能够调用并被用 C 和 C++ 等其他语言编写的原生应用程序和库调用。
此模块查找 Java 是否已安装,并确定包含文件和库的位置。它还确定库的名称。
在 3.24 版本中添加: 导入的目标、组件和 Android NDK 支持。
当使用 Android NDK 时,会报告相应的包版本,并且可以请求特定的发行版。在 Android API 级别 31 及以上,可以请求额外的 NativeHelper 组件。NativeHelper 也作为 JVM 组件的隐式依赖项公开 (仅当不会导致冲突时),它提供了对 JVM 函数的统一访问。
组件¶
此模块支持可选组件,这些组件可以通过 find_package() 命令指定
find_package(JNI [COMPONENTS <components>...])
支持的组件包括
AWT在 3.24 版本中添加。
查找 Java 抽象窗口工具包 (AWT)。
JVM在 3.24 版本中添加。
查找 Java 虚拟机 (JVM)。
NativeHelper在 3.24 版本中添加。
在 Android 上查找 NativeHelper 库 (
libnativehelper.so),该库公开了JNI_CreateJavaVM()等 JVM 函数。
如果未指定组件,则模块的默认值为
当目标为 API 级别 31 及以上的 Android 时:模块查找
NativeHelper组件。对于其他 Android API 级别,默认情况下不设置组件。当目标为其他系统时:模块查找
AWT和JVM组件。
导入的目标¶
此模块提供以下 导入目标
JNI::JNI在 3.24 版本中添加。
封装所有 JNI 使用要求的 मुख्य target,如果找到
jni.h则可用。JNI::AWT在 3.24 版本中添加。
封装 Java AWT 本地接口 (JAWT) 库使用要求的 target,如果找到
AWT组件则可用。JNI::JVM在 3.24 版本中添加。
封装 Java 虚拟机 (JVM) 库使用要求的 target,如果找到
JVM组件则可用。JNI::NativeHelper在 3.24 版本中添加。
封装 NativeHelper 库使用要求的 target,当目标为 Android API 级别 31 及以上且找到库时可用。
结果变量¶
此模块定义了以下变量
JNI_FOUND布尔值,指示是否找到 (请求的版本) JNI。
JNI_<component>_FOUND在 3.24 版本中添加。
布尔值,指示是否找到
<component>。JNI_VERSION完整的 Android NDK 包版本 (包括后缀,如
-beta3和-rc1) 或未定义。JNI_VERSION_MAJOR在 3.24 版本中添加。
Android NDK 主版本或未定义。
JNI_VERSION_MINOR在 3.24 版本中添加。
Android NDK 次版本或未定义。
JNI_VERSION_PATCH在 3.24 版本中添加。
Android NDK 补丁版本或未定义。
JNI_INCLUDE_DIRS使用 JNI 所需的包含目录。
JNI_LIBRARIES使用 JNI 所需链接的库 (JAWT 和 JVM)。
缓存变量¶
以下缓存变量也可用于设置或使用
JAVA_INCLUDE_PATH包含
jni.h头文件的目录。JAVA_INCLUDE_PATH2包含与机器相关的头文件
jni_md.h和jniport.h的目录。仅当jni.h依赖于其中一个头文件时,此变量才会被定义。相比之下,Android NDK 的jni.h通常可以独立使用。JAVA_AWT_INCLUDE_PATH包含
jawt.h头文件的目录。JAVA_AWT_LIBRARYJava AWT 本地接口 (JAWT) 库的路径。
JAVA_JVM_LIBRARYJava 虚拟机 (JVM) 库的路径。
提示¶
此模块接受以下变量
JAVA_HOME调用方可以设置此变量以显式指定 Java 的安装目录。
示例¶
查找 JNI 并将其链接到项目 target
find_package(JNI)
target_link_libraries(project_target PRIVATE JNI::JNI)
查找 JNI 并指定 AWT 组件,并将它们链接到项目 target
find_package(JNI COMPONENTS AWT)
target_link_libraries(project_target PRIVATE JNI::JNI JNI::AWT)
在 CMake 中使用 Java 和 JNI 的一种更常见的方法是使用专用的 UseJava 模块
find_package(Java)
find_package(JNI)
include(UseJava)