2013-05-05 14 views
0

我想在我的Android應用程序中使用本機OpenCV函數getThreshVal_Otsu_8u。我注意到外部的OpenCV Java包裝函數調用函數定義爲native,但它們與實際的本機函數名稱不同。例如:Android - 在預編譯庫中訪問本機函數

Java函數:

double threshold(Mat src, Mat dst, double thresh, double maxval, int type) 

Java的 「原生」 的功能:

private static native double threshold_0(long src_nativeObj, long dst_nativeObj, double thresh, double maxval, int type) 

C++函數:

double cv::threshold(InputArray _src, OutputArray _dst, double thresh, double maxval, int type) 

我怎麼能做出類似native的Java功能撥打電話getThreshVal_Otsu_8u?有沒有辦法避免重建OpenCV庫,只是「隧道」到現有的.lib文件?

回答

1

如果還不是這種情況,首先需要設置Android項目以便使用Java Native Interface(this link might help)。

一旦成立,其原理是很簡單:

  • 你需要在你的Java代碼來創建一個Java本機原型(如public native void yourFunction();
  • 相應的功能,必須在C定義/ C++文件(例如,JNIEXPORT void JNICALL Java_your_package_JavaClassName_yourFunction(JNIEnv * env, jobject obj);
  • 你應該能夠包含在C OpenCV庫/ C++代碼(例如#include <opencv2/core/core.hpp>

釷您想要使用的方法(即getThreshVal_0tsu_8u)將Mat&作爲參數並返回一個double,這意味着您需要相應地調整您的jni代碼。

+0

謝謝,看起來不錯。所以我不需要重新編譯這些庫? – 2013-05-06 14:59:35

+0

您需要將OpenCV庫導入到您的工作空間中,並將其鏈接到您的項目中,但您不必確實編譯它。在OpenCV文檔中有關於此的示例代碼! – JonesV 2013-05-06 21:15:47

+0

謝謝,我來看看。 – 2013-05-06 21:50:43