专栏首页along的开发之旅CMake FindJNI module快速查找jni
原创

CMake FindJNI module快速查找jni

最近在编译skija(JetBrains对skia的Java封装),编译报错:

../src/DirectContext.cc:1:10: fatal error: 'jni.h' file not found
#include <jni.h>
         ^~~~~~~
1 error generated.
[5/53] Building CXX object CMakeFiles/skija.dir/src/ColorSpace.cc.o

说没有<jni.h>,我本地没有特殊配置,没有很正常。

找了下报错的脚本"native/CMakeLists.txt", 发现里面没有找JNI module,于是添加

# JNI
find_package(JNI)
set(JAVA_INCLUDE_PATH "$ENV{JAVA_HOME}/include")

第一步find_package查找失败,只能使用set设置手动添加。

JNI Module常用值:

Result Variables:
JNI_INCLUDE_DIRS      = the include dirs to use
JNI_LIBRARIES         = the libraries to use
JNI_FOUND             = TRUE if JNI headers and libraries were found.

Cache Variables:
JAVA_AWT_LIBRARY      = the path to the jawt library
JAVA_JVM_LIBRARY      = the path to the jvm library
JAVA_INCLUDE_PATH     = the include path to jni.h
JAVA_INCLUDE_PATH2    = the include path to jni_md.h
JAVA_AWT_INCLUDE_PATH = the include path to jawt.h

看FindJNI文档也可发现,其也是借助于JAVA_HOME。

The caller may set variable JAVA_HOME to specify a Java installation prefix explicitly.

查看"Modules/FindJNI.cmake",可见其也是根据哪个文件夹包含"jni.h"这样查找的。

# add in the include path
find_path(JAVA_INCLUDE_PATH jni.h
  ${JAVA_AWT_INCLUDE_DIRECTORIES}
)

set(JNI_LIBRARIES
  ${JAVA_AWT_LIBRARY}
  ${JAVA_JVM_LIBRARY}
)

set(JNI_INCLUDE_DIRS
  ${JAVA_INCLUDE_PATH}
  ${JAVA_INCLUDE_PATH2}
  ${JAVA_AWT_INCLUDE_PATH}
)

find_path (<VAR> name1 [path1 path2 ...])

This command is used to find a directory containing the named file. A cache entry named by<VAR>is created to store the result of this command. If nothing is found, the result will be<VAR>-NOTFOUND.

也就是说查找name1所在的目录,存到<VAR>中返回;如果找不到,就存到<VAR>-NOTFOUND

参考:

https://github.com/JetBrains/skija

https://cmake.org/cmake/help/v3.0/module/FindJNI.html

https://cmake.org/cmake/help/latest/module/FindJNI.html

https://cmake.org/cmake/help/latest/command/find_path.html

https://cloud.tencent.com/developer/article/1433739

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • cmake:善用find_package()提高效率暨查找JNI支持

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • Android Studio中使用jni进行opencv开发的环境配置方法

    使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找不到教程,大多都是e...

    砸漏
  • libyuv的编译与使用

    libyuv是Google开源的实现YUV数据格式转换,旋转,缩放和镜像等操作的库。

    雪月清
  • android串口开发入门之搭建ndk开发环境及第一个jni调用程序

    这几天专门研究了下JNI编程,在网上找了好多资料,不过好多都是以前的,没有更新,而且有的还是错误的,让人不得不吐槽一把。所以觉得自己来一篇,本文将详细介绍关于a...

    砸漏
  • L017 android cmake的使用

    指定编译库的环境,其中Toolchain Default使用的是默认的CMake环境;C++ 11也就是C++环境。两种环境都可以编库,至于区别,后续会跟进,当...

    上善若水.夏
  • NDK学习笔记(1)——第一个jni程序

    用户1665735
  • Ubuntu16.04安装OpenCV

    这里需要下载 opencv 和 opencv_contrib (后者会在 cmake 配置的时候用到), 这是因为 opencv3以后 SIFT 和 SURF ...

    foochane
  • Android NDK 初步

    将手机通过USB连接到电脑,adb shell进入手机根目录,执行cat /proc/cpuinfo

    AnRFDev
  • Android_其他语言交互篇——Js、C#、C、C++

    在Android开发中我们有很多时候要与其他语言进行交互,然而对于小白来说学习安卓就够头疼的了更不用说其他的语言了,很多教程的实现过程繁杂简直是天书,本篇就用最...

    陈宇明

扫码关注云+社区

领取腾讯云代金券