3

Androidでopencvを使用してプロジェクトを行っています。私はc ++でコーディングしていますが、Androidスマートフォンにプログラムを実装したいと考えています。AndroidがJavaにあるという理由だけでC++コードをJavaに変換したくないので、JNIを使​​用します。私の研究では、実際に JNI コーディング スタイルを使用するコードに出くわしましたが、C++ コードを JNI コードに変換する方法がわかりません。Android opencvサンプルのチュートリアル4では、チュートリアル3とは異なり、C++コードのみを使用していることがわかりました..では、これら2つの実際の違いは何ですか? 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 に答える