3

我正在做一个在 android 上使用 opencv 的项目。我正在使用 C++ 进行编码,但想在 Android 智能手机上实现该程序。我不想仅仅因为android在java中就将c++代码转换为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));
}
4

2 回答 2

1

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

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

您不应该总是使用 C 和 C++ 编写代码。它会增加您的应用程序的复杂性。
看到这个

于 2012-11-01T19:18:52.407 回答
1

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

看看这里 我可以用 C++、C 进行 Android 编程吗?

于 2012-11-01T16:12:00.900 回答