FindJNI¶
查找 Java Native Interface (JNI) 的包含目录和库。
JNI 使运行在 Java Virtual Machine (JVM) 或 Dalvik Virtual Machine (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 Abstract Window Toolkit (AWT)。
JVM
在 3.24 版本中添加。
查找 Java Virtual Machine (JVM)。
NativeHelper
在 3.24 版本中添加。
在 Android 上查找 NativeHelper 库(
libnativehelper.so
),该库公开JNI_CreateJavaVM()
等 JVM 函数。
如果未指定任何组件,则模块的默认值为
当以 API 级别 31 及以上版本为 Android 进行目标设置时:模块查找
NativeHelper
组件。对于其他 Android API 级别,默认情况下不设置组件。当以其他系统为目标时:模块查找
AWT
和JVM
组件。
导入的目标¶
此模块提供以下 导入目标
JNI::JNI
在 3.24 版本中添加。
封装所有 JNI 使用需求的主目标,如果找到
jni.h
则可用。JNI::AWT
在 3.24 版本中添加。
封装 Java AWT Native Interface (JAWT) 库使用需求的目标,如果找到
AWT
组件则可用。JNI::JVM
在 3.24 版本中添加。
封装 Java Virtual Machine (JVM) 库使用需求的目标,如果找到
JVM
组件则可用。JNI::NativeHelper
在 3.24 版本中添加。
封装 NativeHelper 库使用需求的目标,在以 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_LIBRARY
Java AWT Native Interface (JAWT) 库的路径。
JAVA_JVM_LIBRARY
Java Virtual Machine (JVM) 库的路径。
提示¶
此模块接受以下变量
JAVA_HOME
调用者可以设置此变量来显式指定 Java 的安装目录。
示例¶
查找 JNI 并将其链接到项目目标
find_package(JNI)
target_link_libraries(project_target PRIVATE JNI::JNI)
查找 JNI 并指定 AWT 组件,并将它们链接到项目目标
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)