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