java - 在java项目中通过cpp和opencv项目使用.so文件
问题描述
我在 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
带有 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
推荐阅读
- microsoft-graph-api - 与 JoinURl 进行在线会议以解决用户问题 - 我错过了哪一步?
- typescript - 类型ORM | 将实体扩展为关系
- wordpress - 获取术语元中具有特定选项的所有标签
- java - 如何在应用程序/数据库中保留未提交的数据直到它被提交
- java - HTTP PUT 方法
- powershell - 批量与变量进行子字符串比较
- python - 滚动条在 tkinter 应用程序中显示为灰色
- sql - 如何根据这些行中的任何列可能更改的可能性替换/更新多行?
- google-data-studio - getSchema() 调用中未定义请求参数
- python - Elasticsearch [索引:管理员/创建]