2013-05-05 13 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