【问题标题】:use .so file by cpp and opencv project in java project在java项目中通过cpp和opencv项目使用.so文件
【发布时间】:2019-09-06 02:51:24
【问题描述】:

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

【问题讨论】:

  • 只是猜测,但根据操作系统,您可能需要将 .so 文件的位置添加到 PATH 或 LD_LIBRARY_PATH 环境变量中。您可能还需要在命令上添加 -Djava.library.path=... 以运行 java。
  • 我的操作系统是 ubuntu 如何查看库的路径?我通过 intellij idea 将 java opencv 库添加到我的项目中!
  • 我认为您可以编辑主目录中的 .profile 文件以放置 export LD_LIBRARY_PATH=/somedir 并注销并重新登录以在 intellij 外部或 intellij goto run 中更改它 -> 编辑配置并放置 - VM选项中的djava.library.path=/somdir或者点击环境变量东西添加LD_LIBRARY_PATH /somdir。

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


【解决方案1】:

您的库似乎正在使用另一个共享库 .so 和 opencv2 代码。

在这种情况下,您必须确保它对您的 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

【讨论】:

  • 我无法将 so 文件添加到 ubuntu 。导出 LD_LIBRARY_PATH ="$LD_LIBRARY_PATH:/usr/local/lib/" 错误:/usr/local/lib/:/usr/local/lib/ 未找到
  • 看起来你的导出中有空间,另外,最好将 LD_LIBRARY_PATH 包装在 ${LD_LIBRARY_PATH} 中
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多