2017-05-06 1 views
0

Ich verstehe nicht, wie kann ich eine native Methode erstellen, die eine Mat nehmen und es modifiziert zurückgeben.undefined Symbol mit lib erstellt mit jni und OpenCV

Ich habe diesen Code in Java-Klasse:

private native void getCanny(long mat); 
getCanny(mat.getNativeObjAddr()); 

und die Mat2Image.h generiert:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class Mat2Image */ 

#ifndef _Included_Mat2Image 
#define _Included_Mat2Image 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  Mat2Image 
* Method: getCanny 
* Signature: (J)V 
*/ 
JNIEXPORT void JNICALL Java_Mat2Image_getCanny 
    (JNIEnv *, jobject, jlong); 

#ifdef __cplusplus 
} 
#endif 
#endif 

und das ist die CPP ich gemacht habe:

#include "Mat2Image.h" 
#include <iostream> 
#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc.hpp> 


JNIEXPORT void JNICALL Java_Mat2Image_getCanny 
    (JNIEnv * env, jobject obj, jlong matr){ 


     cv::Mat* frame=(cv::Mat*)matr; 
      cv::cvtColor(*frame, *frame, CV_BGR2GRAY); 
      cv::GaussianBlur(*frame, *frame, cv::Size(7,7), 1.5, 1.5); 
      cv::Canny(*frame, *frame, 0, 30, 3); 


} 

aber wenn ich versuche, die Methode auszuführen, habe ich diesen Fehler:

/usr/lib/jvm/jdk1.8.0_111/bin/java: symbol lookup error: /home/buzzo/Downloads/helloJni-master/jni/libMat.so: undefined symbol: _ZN2cv8cvtColorERKNS_11_InputArrayERKNS_12_OutputArrayEii 
+1

Was genau ist das Problem mit dem oben genannten? –

+0

der .cpp-Code funktioniert nicht, ich verstehe nicht, wie man es gemacht –

+0

Nun, ich vermutete, dass der CPP-Code nicht funktioniert hat, nur nach der Tatsache zu urteilen, dass diese Frage an erster Stelle steht. Aber wir brauchen mehr Details. Was erwartest du von ihm? Warum erwartest du das? Was macht es eigentlich? Ohne diese Details können wir Ihnen nicht helfen. –

Antwort

1

Wenn Sie eine .so erstellen, verknüpfen Sie normalerweise keine abhängigen Bibliotheken damit. Sie fügen diese beim Erstellen der ausführbaren Datei hinzu. Und der Linker beschwert sich nicht über fehlende Symbole beim Erstellen der .so, sondern wird dies tun, wenn Sie die ausführbare Datei erstellen.

Für JNI jedoch funktioniert das nicht becase Sie verwenden die java ausführbare Datei, die behoben wird, und Sie laden Ihre Bibliothek dynamisch. Also müssen Sie die abhängige Bibliothek in Ihre .so verknüpfen. Finden Sie heraus, welche Bibliothek cvtColor und die anderen Funktionen sind, und suchen Sie die Linkeroptionen für Ihre Toolchain, um zu sehen, wie Sie sie in der Befehlszeile angeben müssen. Beachten Sie auch, dass bei den meisten Linkern die Reihenfolge der Argumente wichtig ist.

+0

Ok, vergiss das. Ich habe gerade gesehen, dass du es selbst herausgefunden hast, als ich deine anderen Fragen bemerkt habe – user2543253

+0

Danke trotzdem :) –

Verwandte Themen