java - Android Gstreamer SDKでANativeWindow_lockがエラー-22を返す

原文 java android c++ c gstreamer

全員、

現在、Android Gstreamer SDKを使用してストリーミングを実装しています。このプロジェクトをhttp://docs.gstreamer.com/display/GstSDK/Android+tutorial+3%3A+Video変更することで、
ストリーミング中に画像をキャプチャしたいので、フレームをレンダリングするJNI関数を追加します。
以下は私の機能です:

void gst_native_render_image(JNIEnv *env, jobject thiz, jobject surface){  

CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
         if (!data) 
             return;

         GST_DEBUG ("Releasing Native Window %p", data->native_window);

         ANativeWindow_Buffer buffer;
         //ANativeWindow *window = ANativeWindow_fromSurface(env, surface);
         render_window = ANativeWindow_fromSurface(env, surface);
         ANativeWindow_acquire(render_window);
         //ANativeWindow *window = data->native_window;
         GST_DEBUG("Got window %p", render_window);

         if(render_window > 0){
                 int width = ANativeWindow_getWidth(render_window);
                 int height = ANativeWindow_getHeight(render_window);

                 GST_DEBUG("Got window %d %d", width,height);

                 ANativeWindow_setBuffersGeometry(render_window, width, height, WINDOW_FORMAT_RGBA_8888);

                 memset((void*)&buffer,0,sizeof(buffer));

                 int lockResult = 0;

                 lockResult = ANativeWindow_lock(render_window, &buffer, NULL);
                 if (lockResult == 0) {
                         GST_DEBUG("GStreamer: ANativeWindow_locked");
                         memcpy(buffer.bits, g_buffer,  640*320);
                         ANativeWindow_unlockAndPost(render_window);
                 }
                 else{
                         GST_DEBUG("GStreamer: ANativeWindow_lock failed error %d",lockResult);
                 }

                 GST_DEBUG("Releasing window");

                 ANativeWindow_release(render_window);
                 (*env)->CallVoidMethod(env, thiz, surface_pixel_render_id); // call JAVA method to save the pixel data....oranhuang
         }else {
                 GST_DEBUG("surface is null");
         }
}


しかし、ANativeWindow_lock()で常にエラー-22が返されます。

ANativeWindow_lock()を間違った方法で使用したり、他に必要なことはありますか????

その行のANativeWindow_lock()との議論はほんの少ししかないからです。
エラーメッセージの修正方法がわかりません。
答え
私も同様に何千時間もかかった同様の問題に遭遇しました。しかし、解決策は非常に簡単であることが判明しました。ANativeWindow_fromSurfaceのコメントからの引用は次のとおりです。

/*... This acquires a reference on the ANativeWindow that is returned; be sure to use ANativeWindow_release() ...*/

したがって、ウィンドウオブジェクトはANativeWindow_fromSurfaceでロックされます。 ANativeWindow_acquireだけではありません!したがって、答えは次のとおりです。ウィンドウをロックする前にANativeWindow_releaseを一度呼び出した場合は、2回解放するためにANativeWindow_acquireを呼び出す必要があります。
関連記事

java - Lucene Library 4.1.0でプラス記号をエスケープする方法

java - 特定のメソッドからのメソッドへの呼び出しの検出または防止

java - Randomインスタンスをグローバルに宣言する必要があります。もっと良い方法はありますか?

java - ArrayList全体にクラスメソッドを適用する

java - Java 2次元配列と平均

java - JAVAのDOM to XMLが機能しない

java - CriteriaQueryで静的メタモデルのListAttributeタイプのフィールドを使用する

java - ダイクストラアルゴリズム:パスが間違っている[終了]

java - Spring JSP Hibernateで2列を渡す最善の方法

java - バージョンをビルドするたびに自動的に増分することは可能ですか?