使用JNI连接到Java的JNI编码和c / c编码之间的区别

时间:2012-11-01 15:51:37

标签: android c++ java-native-interface

我在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));
}

2 个答案:

答案 0 :(得分:1)

您可以使用Android NDK使用c / c ++构建一个Android应用程序

看看这里 Can I do Android Programming in C++, C?

答案 1 :(得分:1)

JNI是Java代码和本机代码(C,C ++)之间的层。它依赖于native关键字和静态方法。在您的应用程序中,您将只使用Java方法和类。您需要将C / C ++源代码编译为动态库,即.so文件。

JNI允许编写本机方法来处理当应用程序不能完全用Java编程语言编写时的情况,例如:当标准Java类库不支持特定于平台的功能或程序库

您不应始终使用C和C ++编写代码。它会增加应用程序的复杂性。
see this