java - 使用 jni 和 OpenCV 创建的带有 lib 的 undefined symbol

标签 java c++ opencv java-native-interface

我不明白如何创建一个接受 Mat 并返回修改后的本地方法。

我在 java 类中有这段代码:

private native void getCanny(long mat);
getCanny(mat.getNativeObjAddr());

和生成的 Mat2Image.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Mat2Image */

#ifndef _Included_Mat2Image
#define _Included_Mat2Image
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Mat2Image
 * Method:    getCanny
 * Signature: (J)V
 */
JNIEXPORT void JNICALL Java_Mat2Image_getCanny
  (JNIEnv *, jobject, jlong);

#ifdef __cplusplus
}
#endif
#endif

这是我制作的.cpp:

#include "Mat2Image.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc.hpp>


JNIEXPORT void JNICALL Java_Mat2Image_getCanny
   (JNIEnv * env, jobject obj, jlong matr){


       cv::Mat* frame=(cv::Mat*)matr;
            cv::cvtColor(*frame, *frame, CV_BGR2GRAY);
            cv::GaussianBlur(*frame, *frame, cv::Size(7,7), 1.5, 1.5);
            cv::Canny(*frame, *frame, 0, 30, 3);


}

但是当我尝试运行该方法时出现此错误:

/usr/lib/jvm/jdk1.8.0_111/bin/java: symbol lookup error: /home/buzzo/Downloads/helloJni-master/jni/libMat.so: undefined symbol: _ZN2cv8cvtColorERKNS_11_InputArrayERKNS_12_OutputArrayEii

最佳答案

当您构建一个.so 时,您通常不会将依赖库与其链接起来。您在构建可执行文件时添加它们。链接器在构建 .so 时不会提示缺少符号,但会在您构建可执行文件时提示。

然而,对于 JNI,这不起作用,因为您使用的是固定的 java 可执行文件,并且您动态加载了您的库。因此,您必须将依赖库链接到您的 .so 中。查明 cvtColor 库和其他函数在哪个库中,并查找工具链的链接器选项以了解您需要如何在命令行上指定它。另请注意,对于大多数链接器,参数的顺序很重要。

关于java - 使用 jni 和 OpenCV 创建的带有 lib 的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819117/

相关文章:

java - 编译轮次中处理环境成员的一致性

c++ - 推广结构访问的有效且实用的方法?

c# - 多语言 RPC 库

c - 如何从 IplImage* 中取出 JPEG 并且不将其保存到硬盘并将保存的数据放入 char* 中?

android - Android OpenCV教程5相机控制崩溃

java - 在fragment后台线程中更新TextView(UI线程)

java - 在 liferay 主题中使用 java 类?

java - Swing 中的同步

c++ - 在启用自动(基于扩展)选项的情况下,IAR 无法正确编译 C++ 文件

Python3 Pillow 获取一条线上的所有像素