首页 > 解决方案 > 在java项目中通过cpp和opencv项目使用.so文件

问题描述

我在 c++ 项目中添加 opencv 库并在 java 项目中添加 java 库但是当将 .so 文件添加到 java 项目时

#include <iostream>
#include "jni.h"
#include "OpencvCpp.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <string.h>

using namespace cv;
using namespace std;


JNIEXPORT jfloat JNICALL Java_OpencvCpp_myFirsttest
        (JNIEnv *, jobject){

//int main() {

    Mat img, img2;

    string filename = "/home/mohsen/Desktop/1.jpg";
    img = imread(filename);
    float m;
    for (int i = 0; i < 96; ++i) {
        for (int j = 0; j < 96; ++j) {
            m = m + img.at<uchar>(i, j);
        }

    }
    cout << m;
    return m;
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
/* Header for class OpencvCpp */

#ifndef _Included_OpencvCpp
#define _Included_OpencvCpp
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     OpencvCpp
 * Method:    myFirsttest
 * Signature: ()F
 */
JNIEXPORT jfloat JNICALL Java_OpencvCpp_myFirsttest
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

当我运行 c++ 项目时,在获取 .so 文件并在 java 项目中使用时返回良好的结果,显示此错误:

未定义符号:_ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi

标签: javac++opencvjava-native-interface

解决方案


看起来您的库正在使用另一个.so带有 opencv2 代码的共享库。

在这种情况下,您必须确保它对您的 JVM 可见。这里的原因是,一旦你“离开”JVM 并且你在你的.so所有依赖库中,都是由系统而不是 JVM 解析的。

在这里查看一个示例,其中.so为 JNI 创建是基于另一个.so.

http://jnicookbook.owsiak.org/recipe-No-023/

JNI 玩得开心!:)

更新

设置LD_LIBRARY_PATH使用以下

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib

推荐阅读