2017-05-06 22 views
0

我不明白我怎麼能創造出採取墊並返回修改的本地方法。用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你平時不與它鏈接dependendent庫。您在構建可執行文件時添加它們。鏈接器在構建.so時不會抱怨丟失的符號,但在構建可執行文件時會這樣做。

對於JNI然而,這不起作用becase的使用java可執行文件,它是固定的,你動態加載磁帶庫。所以你必須把依賴庫鏈接到你的.so。找出庫cvtColor和其他函數,並查找工具鏈的鏈接器選項,以查看如何在命令行上指定它。另外請注意,對於大多數連接器來說,參數的順序很重要。

+0

好的,忘記了。我剛剛看到你發現你自己,當我注意到你的其他問題 – user2543253

+0

謝謝:) –