2017-05-06 11 views
0

Matを受け取って修正したネイティブメソッドを作成する方法を理解できません。jniとOpenCVで作成されたlibで未定義のシンボル

私は、このJavaクラスのコードがあります。

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

とMat2Image.hを生成:

/* 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 

、これは私が作ったの.cppです:

#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); 


} 

しかし、私はこのエラーがあるメソッドを実行しようとするとき:

/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

上記の問題はどういったものですか? –

+0

.cppコードは機能しません。作成方法がわかりません。 –

+0

.cppコードがうまくいかなかったと思いました。この質問がここにあるということで判断してください。しかし、私たちはもっと詳細が必要です。あなたはそれが何をすると思いますか?なぜあなたはそれを期待していますか?それは実際に何をしていますか?これらの詳細がなければ、私たちはあなたを助けることはできません。 –

答えて

1

.soをビルドするときには、通常、それに依存するライブラリをリンクしません。代わりに実行可能ファイルをビルドするときに追加します。また、リンカーは.soをビルドするときにシンボルの欠落については不平を言いませんが、実行可能ファイルをビルドするときにはそうします。

ただし、java実行ファイルを使用して固定されており、ライブラリを動的にロードするため、JNIの場合は動作しません。したがって、依存ライブラリを.soにリンクする必要があります。どのライブラリcvtColorと他の関数があるかを調べ、コマンドラインでどのように指定する必要があるかを知るために、あなたのツールチェーンのリンカオプションを調べます。また、ほとんどのリンカーでは、引数の順序が重要であることにも注意してください。

+0

さて、忘れてください。私はちょうどあなたが他の質問に気づいたときに自分自身を見つけたことを見た – user2543253

+0

ありがとうとにかく:) –

関連する問題