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