我在android上使用opencv做一个项目。我用c ++编写代码,但想在Android智能手机上实现该程序。我不想将c ++代码转换为java只是因为android在java中,所以我要使用JNI。在我的研究中,我遇到了真正使用JNI编码风格的代码,但我无法理解如何将我的c ++代码转换为JNI代码。我发现在android opencv示例的教程4中,它只使用了与教程3中不同的c ++代码。那么这两者之间究竟有什么区别呢?我想知道JNI编码风格是否会给我更快的性能。截至目前,我只能使用c ++并将其与java一起使用但应用程序崩溃了。
来自android opencv教程3:
JNIEXPORT void JNICALL
Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject,
jint width, jint height, jbyteArray yuv, jintArray bgra)
{
jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
jint* _bgra = env->GetIntArrayElements(bgra, 0);
Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
Mat mgray(height, width, CV_8UC1, (unsigned char *)_yuv);
cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
vector<KeyPoint> v;
FastFeatureDetector detector(50);
detector.detect(mgray, v);
for( size_t i = 0; i < v.size(); i++ )
circle(mbgra, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(0,0,255,255));
env->ReleaseIntArrayElements(bgra, _bgra, 0);
env->ReleaseByteArrayElements(yuv, _yuv, 0);
}
来自android opencv教程4:
JNIEXPORT void JNICALL
Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv*, jobject, jlong
addrGray, jlong addrRgba)
{
Mat* pMatGr=(Mat*)addrGray;
Mat* pMatRgb=(Mat*)addrRgba;
vector<KeyPoint> v;
FastFeatureDetector detector(50);
detector.detect(*pMatGr, v);
for( size_t i = 0; i < v.size(); i++ )
circle(*pMatRgb, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(255,0,0,255));
}
答案 0 :(得分:1)
您可以使用Android NDK使用c / c ++构建一个Android应用程序
答案 1 :(得分:1)
JNI是Java代码和本机代码(C,C ++)之间的层。它依赖于native关键字和静态方法。在您的应用程序中,您将只使用Java方法和类。您需要将C / C ++源代码编译为动态库,即.so文件。
JNI允许编写本机方法来处理当应用程序不能完全用Java编程语言编写时的情况,例如:当标准Java类库不支持特定于平台的功能或程序库
时您不应始终使用C和C ++编写代码。它会增加应用程序的复杂性。
see this