本家フォーラムより。
Surface to Native – Android Developers | Google Groups
SurfaceオブジェクトをNativeで使いたいということのようだ。
Googleのエンジニアからのレスとして
Sorry, there is currently no API in the NDK for working with surfaces.
NDKには今そういうAPIは無いと。まぁそうだろう。
How is the existing applications passing surface to their native libs?
Example Media Player or recorder Java Application to Opencore?
ということで、既存のアプリ、MediaPlayerなどはどうやってJavaからSurfaceをNative(OpenCore)に渡しているのか?
これは、実際にソースを読むと分かるのだけど、frameworks/base/media/java/android/madia/MediaPlayer.java のsetDisplay()でMediaPlayer.mSurfaceにSurfaceオブジェクトのインスタンスが格納される。
そしてMediaPlayer.Create()から、
public native void prepare() throws IOException, IllegalStateException;
nativeのprepare()が呼ばれる。
これがJNI層のframeworks/base/media/jni/androidmediaMediaPlayer.cppのandroidmediaMediaPlayer_prepare()に関連づけられていて、SurfaceオブジェクトはNative層に降りてくる。
jobject surface = env->GetObjectField(thiz, fields.surface);
if (surface != NULL) {
const sp<Surface>& native_surface = get_surface(env, surface);
LOGV("prepare: surface=%p (id=%d)",
native_surface.get(), native_surface->ID());
mp->setVideoSurface(native_surface);
}
JNIのGetObjectField()を使ってJavaのSurfaceオブジェクトを取得し、それからget_surface()を使ってNativeのSurfaceオブジェクトにしている。具体的には以下の行。
const sp<Surface>& native_surface = get_surface(env, surface);
さて、このget_surface()は、以下のような感じ。
static sp<Surface> get_surface(JNIEnv* env, jobject clazz)
{
Surface* const p = (Surface*)env->GetIntField(clazz, fields.surface_native);
return sp<Surface>(p);
}
単にキャストしてるだけに見える。その仕組みとは。
そもそも、JavaのSurfaceクラスと、NativeのSurfaceオブジェクトは一心同体で、JavaでSurfaceクラスのインスタンスを作ると、その時点で対応するNativeのSurfaceクラスのインスタンスも作られる仕組みになっている。
JavaのSurfaceのコンストラクタの中でJNIを通してNativeのSurfaceのインスタンスを作り、そのポインタ(アドレス)をSurface.javaのmSurfaceフィールドに保持して関連づけている。あとは、必要に応じてJavaとNativeでそれぞれのSurfaceインスタンスを取りだして操作しているのだ。
JavaのクラスとNativeのクラスとの関連づけの方法は応用が利きそう。Java側はNativeのことを考えずにインスタンスを使うことができ、そして必要な時にNativeで処理させるって具合で。
関連する記事:
- AndroidでJavaとNativeとのやり取り(JNIは絶対必要?Socketなどは…?) 本家フォーラムにちょっと興味深いネタが。 Registering a java method as a callback function -...
- Android開発者はUbuntu9.10にアップデートしないほうがいいかも と言っても、SDKだけを使うアプリ開発者ではなく、フルソースをビルドして開発する人向けのネタ。 まず、フルソースのビルドに必要なJava1.5がアップデート時に削除されてしまう。 Java1.5(Java5)はSunのサポート期限切れになったのでUbunutuでもサポートしない、というのがその理由なんだけど、AndroidのソースをビルドするにはJava5しか使えない(ビルドスクリプトがバージョン......
- JNIでnativeからJavaをコールバックするには?…JNIは分かりづらい Callback mechanism from native to java ?? - android-ndk |...
- [android]masterブランチにOpenCORE 2.05がマージ Announcing OpenCORE 2.05 release - android-platform | Google グループ 変更箇所は多岐にわたるっぽいけど、ざっと見て目玉になりそうなのは何だろう?...
- AndroidでNativeのデバッグが(未だに?)できない件 Debug Native JNI code on Android emulator - Android Developers...
- AndroidでのA2DPの扱いは? SDKのAPIリファレンスを眺めているだけで、実機で動作確認したわけでは無いけど...。 Androidでは、android.media.AudioManagerのisBluetoothA2dpOn()というメソッドがあるので、A2DP接続中かどうかをアプリが見ることはできるけど、アプリから明示的にA2DPへ音声ルートを切り替えるのはできないんだろうか。 以前のバージョンのAndroidでは、se......
- 新しい: そういえば趣味らしい趣味が無いですねぇ
- 古い: 思考の整理学(外山滋比古)
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://www.swingingblue.net/mt/archives/002565.html/trackback
- トラックバックの送信元リスト
- AndroidのMadiaPlayerはSurfaceをどうやってNativeに渡しているか? - きままな日記帳 より
