在Java项目中使用cpp和opencv项目使用.so文件

时间:2019-04-16 04:50:58

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

我在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

1 个答案:

答案 0 :(得分:0)

您的库似乎正在使用另一个带有Opencv2代码的共享库.so

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

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

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

与JNI玩得开心! :)

更新

要设置LD_LIBRARY_PATH,请使用以下

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