从JNI共享库访问其他库 - 是否允许?

时间:2014-03-16 03:03:36

标签: java maven opencv java-native-interface shared-libraries

我正在尝试开发一个在STORM框架上运行的应用程序,并使用openCV进行人脸识别。 首先,我使用maven(一个构建管理系统)创建了一个简单的项目,并使用它运行一个简单的JNI程序。但是,当我将它扩展为运行一个简单的OpenCV程序时,它编译得很好,但是当JNI C ++代码在OpenCV中创建MAT对象时,它会产生符号查找错误。 这是Native函数。

#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <jni.h>
#include <stdio.h>
#include "ie_agisoft_Test.h"
using namespace std;
using namespace cv;
JNIEXPORT void JNICALL Java_ie_agisoft_Test_hello(JNIEnv *, jobject) 
{
cout << "Hello World\n" << endl;
cout << "salmost there \n" <<endl;

Mat img = imread("Sairam.jpg");
imwrite("Saicopy.jpg", img);

    cout << "read the image \n"<<endl;
}

这是错误。 java:符号查找错误:/tmp/libagisoft6338470031759870366.so:undefined symbol:_ZN2cv6imreadERKSsi

我正在使用maven构建系统来构建它,并且我有一个生成.so文件的makefile,并将其保存在target / classes文件夹中。

有没有人可以解释为什么我的应用程序无法访问其他库,尽管编译和链接很好?

这是完整的makefile。

CC=gcc
CFLAGS= -c -Wall -fPIC -I/usr/lib/jvm/java-6-openjdk-amd64/include 
LDFLAGS=-fPIC -shared `pkg-config  opencv --cflags --libs`

SOURCES_DIR=src/main/c++
OBJECTS_DIR=target/c++
EXECUTABLE=target/classes/libagisoft.so

SOURCES=$(shell find '$(SOURCES_DIR)' -type f -name '*.cpp')
OBJECTS=$(SOURCES:$(SOURCES_DIR)/%.cpp=$(OBJECTS_DIR)/%.o)

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@

$(OBJECTS): $(SOURCES)
mkdir -p $(OBJECTS_DIR)
$(CC) $(CFLAGS) $< -o $@

clean:
rm -rf $(OBJECTS_DIR) $(EXECUTABLE)

提前致谢。如果我能提供更多细节以便为您提供清晰的图片,请告诉我。


这是make文件输出

mkdir -p target/c++
gcc -c -Wall -fPIC -I/usr/lib/jvm/java-6-openjdk-amd64/include  src/main    
/c++/ie_agisoft_Test.cpp -o target/c++/ie_agisoft_Test.o
gcc -fPIC -shared -I/usr/local/include/opencv -I/usr/local/include  /usr/local   
/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local
/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local
/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local
/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local
/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local
/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local
/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local
/lib/libopencv_ts.so /usr/local/lib/libopencv_video.so /usr/local
/lib/libopencv_videostab.so   target/c++/ie_agisoft_Test.o -o target/classes/libagisoft.so

2 个答案:

答案 0 :(得分:1)

Backticks不能在Makefile中工作。请改用$(shell ...)

# LDFLAGS=-fPIC -shared `pkg-config  opencv --cflags --libs`
LDFLAGS=-fPIC -shared $(shell pkg-config  opencv --cflags --libs)

# manually inspect the value of LDFLAGS
$(error $(LDFLAGS))

答案 1 :(得分:1)

-l选项必须在.o文件之后。只有那些库被加载了指定的库,这些库满足到目前为止遇到的未解析的引用,它们在目标文件之前都没有。所以你应该在命令的末尾放置$(LDFLAGS)。