求助:OpenCV_contrib交叉编译至Java后部分模块生成空类
我之前也踩过OpenCV Java绑定编译的坑,结合你的情况,给你几个具体的排查方向:
先确认模块是否支持Java绑定
不是所有OpenCV contrib模块都提供Java接口的。你可以去opencv_contrib/modules/line_descriptors和dpm的源码目录里找找:有没有java子文件夹?或者C++文件里有没有带JNIEXPORT、Java_前缀的JNI绑定函数?如果完全没有这些内容,那生成空的Java类是正常的——因为CMake根本找不到要绑定的代码,只能生成一个空壳子。检查CMake配置的关键开关
交叉编译时很容易漏开一些关键选项,你可以核对下cmakevars里的这些设置:BUILD_JAVA:必须设为ON,否则不会生成任何Java绑定BUILD_opencv_line_descriptors和BUILD_opencv_dpm:确认这两个模块的编译开关是ONOPENCV_EXTRA_MODULES_PATH:要准确指向opencv_contrib的modules目录,不能写错路径
另外,交叉编译时CMake需要正确找到JDK,看看JAVA_HOME环境变量有没有配置,cmakevars里的JAVA_INCLUDE_PATH、JAVA_AWT_INCLUDE_PATH这些变量是不是指向了JDK的正确路径。
别轻易注释核心头文件
你注释掉reg.cpp里的#include reg.hpp和datasets.cpp里的#include datasets.hpp,可能直接破坏了模块的核心逻辑,导致模块编译不完整,自然生成不了有效的JNI绑定。建议先恢复这些头文件,然后看编译时的错误信息——如果是头文件找不到,应该去解决依赖问题(比如是不是漏装了某个库,或者其他依赖模块没编译),而不是强行注释。查看编译日志里的JNI生成细节
编译时CMake会自动处理Java绑定的生成:先编译Java类,再用javah生成JNI头文件,最后编译对应的C++绑定代码。你可以在编译日志里搜line_descriptors和dpm的关键词,看看有没有类似「Generating JNI headers for...」的记录,或者编译绑定代码时的错误。如果日志里完全没提到这两个模块的JNI生成,那要么是模块不支持Java,要么是CMake没检测到绑定代码。清理缓存重新编译
交叉编译时CMake的缓存经常会出问题,建议你删掉整个build目录,重新运行CMake配置,再从头编译。另外可以试试关闭优化选项(BUILD_OPTIMIZATION=OFF),或者设置OPENCV_JAVA_BUILD_SHARED_LIBS=ON(如果之前是静态编译的话),有些优化会跳过绑定代码的生成。
如果方便的话,可以把cmakevars里和Java、contrib模块、MinGW交叉编译相关的部分贴出来,不用全贴,关键变量就行,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者Faraday

