использовать файл .so с помощью cpp и проекта opencv в проекте java

#java #c #opencv #java-native-interface

#java #c #opencv #java-native-interface

Вопрос:

я добавляю библиотеку opencv в проект c и добавляю библиотеку 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. Просто предположение, но в зависимости от операционной системы вам может потребоваться добавить местоположение файла .so в переменную среды PATH или LD_LIBRARY_PATH . Вам также может потребоваться добавить -Djava.library.path=… в команду для запуска java.

2. моя ОС — ubuntu, как определить путь к библиотеке? я добавляю библиотеку java opencv в свой проект с помощью intellij idea!

3. Я думаю, вы можете отредактировать файл .profile в своем домашнем каталоге, чтобы поместить export LD_LIBRARY_PATH=/somedir и выйти из системы и вернуться, чтобы изменить его вне intellij или в intellij goto run -> edit configuration и поместить -Djava.library.path= /somdir в параметры виртуальной машины или щелкнуть переменные среды, чтобыдобавьте LD_LIBRARY_PATH /somdir.

Ответ №1:

Похоже, ваша библиотека использует другую общую библиотеку .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
  

Комментарии:

1. я не могу добавить такой файл в ubuntu. ошибка экспорта LD_LIBRARY_PATH =»$ LD_LIBRARY_PATH:/usr/local/ lib/»: /usr/local/lib/:/usr/local/ lib/ не найден

2. Похоже, у вас есть место в вашем экспорте, кроме того, неплохо обернуть LD_LIBRARY_PATH внутри $ {LD_LIBRARY_PATH}