1

これは、android-ndk で徹底的に作業した人だけが答えられると思う問題です。

問題:ファイル エクスプローラーを使用して入力ファイルを読み取るアプリケーションを作成しました。次に、[デコードと再生] ボタンが押されると、アプリケーションはエンコードされた入力ファイルをデコードし、デバイスの画面に表示する必要があります。ここでの問題は、デコードがネイティブ コードで実行されることです。SDカードにダンプし、生のビデオプレーヤーを使用して検証したため、デコードは適切です。デコードされたフレームは RGB888 形式で、データ型はunsigned charです。したがって、ネイティブコードからデータを表示する方法を知っている人は、同じことについていくつか提案してください。

私は試しました:最初にネイティブコードが呼び出された関数にフレームバッファを返し、次にフレームバッファをchar配列に変換し、この配列をJavaオブジェクト(つまりjcharArray)としてアクティビティに返しました。私のアクティビティでは、char 配列を int 配列に変換し、setpixels() 関数を使用してこの配列をビットマップに割り当てました。そして、キャンバスを使用して、このフレームをデバイス画面に描画しました。どのようにアプリケーションがクラッシュしたか、主なことは、フレームがデコードされるたびにコントロールが Java アクティビティに戻らないように見えることです。さらに、この手法が機能したとしても、表示されるフレームが非常に遅くなり、ビデオのようには見えません。

ですから、同じことをするための提案やテクニックを提供してくださるようお願いします。よろしくお願いします...返信を待っています...

4

1 に答える 1

0

ほとんどの作業を Java で行っており、ビットマップ データを JNI から Java に渡したいだけのようです。(別の方法として、OpenGL ES を使用して JNI 側から描画自体を行うことも含まれます。) この場合は<android/bitmap.h>、jnigraphics ライブラリ ( ) にリンクする必要があるヘッダーを確認してください-ljnigraphics

基本的に、次のことを行います。

  1. android.graphics.BitmapJava 側で適切なフレーム サイズとデータ型の を作成し、それを JNI コードに渡します。
  2. 受信側の JNI コードで、 を呼び出し、または同等のものAndroidBitmap_lockPixels()を使用して結果のポインタにデータをコピーし、でビットマップのロックを解除して、Java に戻ります。memcpy()AndroidBitmap_unlockPixels()
  3. Java 側に戻ると、ビットマップを他の方法で使用する場合はどこでも使用できます。
于 2013-02-23T04:54:35.677 に答える