#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}