diff options
Diffstat (limited to 'media/java')
25 files changed, 214 insertions, 79 deletions
diff --git a/media/java/android/media/AmrInputStream.java b/media/java/android/media/AmrInputStream.java index 8b7eee2..e2115e4 100644 --- a/media/java/android/media/AmrInputStream.java +++ b/media/java/android/media/AmrInputStream.java @@ -41,7 +41,7 @@ public final class AmrInputStream extends InputStream private InputStream mInputStream; // native handle - private int mGae; + private long mGae; // result amr stream private final byte[] mBuf = new byte[SAMPLES_PER_FRAME * 2]; @@ -130,11 +130,11 @@ public final class AmrInputStream extends InputStream // // AudioRecord JNI interface // - private static native int GsmAmrEncoderNew(); - private static native void GsmAmrEncoderInitialize(int gae); - private static native int GsmAmrEncoderEncode(int gae, + private static native long GsmAmrEncoderNew(); + private static native void GsmAmrEncoderInitialize(long gae); + private static native int GsmAmrEncoderEncode(long gae, byte[] pcm, int pcmOffset, byte[] amr, int amrOffset) throws IOException; - private static native void GsmAmrEncoderCleanup(int gae); - private static native void GsmAmrEncoderDelete(int gae); + private static native void GsmAmrEncoderCleanup(long gae); + private static native void GsmAmrEncoderDelete(long gae); } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index f49ef2e..461b52f 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -107,13 +107,13 @@ public class AudioRecord * Accessed by native methods: provides access to C++ AudioRecord object */ @SuppressWarnings("unused") - private int mNativeRecorderInJavaObj; + private long mNativeRecorderInJavaObj; /** * Accessed by native methods: provides access to the callback data. */ @SuppressWarnings("unused") - private int mNativeCallbackCookie; + private long mNativeCallbackCookie; //--------------------------------------------------------- diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 78a37c5..01a6fc2 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -221,13 +221,13 @@ public class AudioTrack * Accessed by native methods: provides access to C++ AudioTrack object. */ @SuppressWarnings("unused") - private int mNativeTrackInJavaObj; + private long mNativeTrackInJavaObj; /** * Accessed by native methods: provides access to the JNI data (i.e. resources used by * the native AudioTrack object, but not stored in it). */ @SuppressWarnings("unused") - private int mJniData; + private long mJniData; //-------------------------------------------------------------------------- diff --git a/media/java/android/media/FaceDetector.java b/media/java/android/media/FaceDetector.java index cf900ce..61991e3 100644 --- a/media/java/android/media/FaceDetector.java +++ b/media/java/android/media/FaceDetector.java @@ -191,9 +191,9 @@ public class FaceDetector { native private void fft_get_face(Face face, int i); native private void fft_destroy(); - private int mFD; - private int mSDK; - private int mDCR; + private long mFD; + private long mSDK; + private long mDCR; private int mWidth; private int mHeight; private int mMaxFaces; diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index 06cda34..bd91fc5 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -127,7 +127,7 @@ public class JetPlayer * Accessed by native methods: provides access to C++ JetPlayer object */ @SuppressWarnings("unused") - private int mNativePlayerInJavaObj; + private long mNativePlayerInJavaObj; //-------------------------------------------- diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 5175830..ddf88df 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -644,5 +644,5 @@ final public class MediaCodec { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaCrypto.java b/media/java/android/media/MediaCrypto.java index 40a1326..c7c3fc2 100644 --- a/media/java/android/media/MediaCrypto.java +++ b/media/java/android/media/MediaCrypto.java @@ -88,5 +88,5 @@ public final class MediaCrypto { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index 6b278d4..532e39a 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -21,6 +21,8 @@ import java.lang.ref.WeakReference; import java.util.UUID; import java.util.HashMap; import java.util.List; +import android.os.Binder; +import android.os.Debug; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -97,10 +99,26 @@ public final class MediaDrm { private final static String TAG = "MediaDrm"; + private static final String PERMISSION = android.Manifest.permission.ACCESS_DRM_CERTIFICATES; + private EventHandler mEventHandler; private OnEventListener mOnEventListener; - private int mNativeContext; + private long mNativeContext; + + /** + * Specify no certificate type + * + * @hide - not part of the public API at this time + */ + public static final int CERTIFICATE_TYPE_NONE = 0; + + /** + * Specify X.509 certificate type + * + * @hide - not part of the public API at this time + */ + public static final int CERTIFICATE_TYPE_X509 = 1; /** * Query if the given scheme identified by its UUID is supported on @@ -137,7 +155,7 @@ public final class MediaDrm { } private static final native boolean isCryptoSchemeSupportedNative(byte[] uuid, - String mimeType); + String mimeType); /** * Instantiate a MediaDrm object @@ -161,7 +179,7 @@ public final class MediaDrm { * It's easier to create it here than in C++. */ native_setup(new WeakReference<MediaDrm>(this), - getByteArrayFromUUID(uuid)); + getByteArrayFromUUID(uuid)); } /** @@ -270,7 +288,7 @@ public final class MediaDrm { * the cookie passed to native_setup().) */ private static void postEventFromNative(Object mediadrm_ref, - int eventType, int extra, Object obj) + int eventType, int extra, Object obj) { MediaDrm md = (MediaDrm)((WeakReference)mediadrm_ref).get(); if (md == null) { @@ -318,6 +336,9 @@ public final class MediaDrm { * Contains the opaque data an app uses to request keys from a license server */ public final static class KeyRequest { + private byte[] mData; + private String mDefaultUrl; + KeyRequest() {} /** @@ -331,9 +352,6 @@ public final class MediaDrm { * server URL from other sources. */ public String getDefaultUrl() { return mDefaultUrl; } - - private byte[] mData; - private String mDefaultUrl; }; /** @@ -370,9 +388,8 @@ public final class MediaDrm { * problem with the certifcate */ public native KeyRequest getKeyRequest(byte[] scope, byte[] init, - String mimeType, int keyType, - HashMap<String, String> optionalParameters) - throws NotProvisionedException; + String mimeType, int keyType, HashMap<String, String> optionalParameters) + throws NotProvisionedException; /** @@ -396,7 +413,7 @@ public final class MediaDrm { * @throws ResourceBusyException if required resources are in use */ public native byte[] provideKeyResponse(byte[] scope, byte[] response) - throws NotProvisionedException, DeniedByServerException; + throws NotProvisionedException, DeniedByServerException; /** @@ -458,7 +475,12 @@ public final class MediaDrm { * is returned in ProvisionRequest.data. The recommended URL to deliver the provision * request to is returned in ProvisionRequest.defaultUrl. */ - public native ProvisionRequest getProvisionRequest(); + public ProvisionRequest getProvisionRequest() { + return getProvisionRequestNative(CERTIFICATE_TYPE_NONE, ""); + } + + private native ProvisionRequest getProvisionRequestNative(int certType, + String certAuthority); /** * After a provision response is received by the app, it is provided to the DRM @@ -470,8 +492,13 @@ public final class MediaDrm { * @throws DeniedByServerException if the response indicates that the * server rejected the request */ - public native void provideProvisionResponse(byte[] response) - throws DeniedByServerException; + public void provideProvisionResponse(byte[] response) + throws DeniedByServerException { + provideProvisionResponseNative(response); + } + + private native Certificate provideProvisionResponseNative(byte[] response) + throws DeniedByServerException; /** * A means of enforcing limits on the number of concurrent streams per subscriber @@ -558,23 +585,22 @@ public final class MediaDrm { private static final native void setCipherAlgorithmNative(MediaDrm drm, byte[] sessionId, - String algorithm); + String algorithm); private static final native void setMacAlgorithmNative(MediaDrm drm, byte[] sessionId, - String algorithm); + String algorithm); private static final native byte[] encryptNative(MediaDrm drm, byte[] sessionId, - byte[] keyId, byte[] input, byte[] iv); + byte[] keyId, byte[] input, byte[] iv); private static final native byte[] decryptNative(MediaDrm drm, byte[] sessionId, - byte[] keyId, byte[] input, byte[] iv); + byte[] keyId, byte[] input, byte[] iv); private static final native byte[] signNative(MediaDrm drm, byte[] sessionId, - byte[] keyId, byte[] message); + byte[] keyId, byte[] message); private static final native boolean verifyNative(MediaDrm drm, byte[] sessionId, - byte[] keyId, byte[] message, - byte[] signature); + byte[] keyId, byte[] message, byte[] signature); /** * In addition to supporting decryption of DASH Common Encrypted Media, the @@ -604,7 +630,7 @@ public final class MediaDrm { private byte[] mSessionId; CryptoSession(MediaDrm drm, byte[] sessionId, - String cipherAlgorithm, String macAlgorithm) + String cipherAlgorithm, String macAlgorithm) { mSessionId = sessionId; mDrm = drm; @@ -679,12 +705,124 @@ public final class MediaDrm { * "algorithms". */ public CryptoSession getCryptoSession(byte[] sessionId, - String cipherAlgorithm, - String macAlgorithm) + String cipherAlgorithm, String macAlgorithm) { return new CryptoSession(this, sessionId, cipherAlgorithm, macAlgorithm); } + /** + * Contains the opaque data an app uses to request a certificate from a provisioning + * server + * + * @hide - not part of the public API at this time + */ + public final static class CertificateRequest { + private byte[] mData; + private String mDefaultUrl; + + CertificateRequest(byte[] data, String defaultUrl) { + mData = data; + mDefaultUrl = defaultUrl; + } + + /** + * Get the opaque message data + */ + public byte[] getData() { return mData; } + + /** + * Get the default URL to use when sending the certificate request + * message to a server, if known. The app may prefer to use a different + * certificate server URL obtained from other sources. + */ + public String getDefaultUrl() { return mDefaultUrl; } + } + + /** + * Generate a certificate request, specifying the certificate type + * and authority. The response received should be passed to + * provideCertificateResponse. + * + * @param certType Specifies the certificate type. + * + * @param certAuthority is passed to the certificate server to specify + * the chain of authority. + * + * @hide - not part of the public API at this time + */ + public CertificateRequest getCertificateRequest(int certType, + String certAuthority) + { + ProvisionRequest provisionRequest = getProvisionRequestNative(certType, certAuthority); + return new CertificateRequest(provisionRequest.getData(), + provisionRequest.getDefaultUrl()); + } + + /** + * Contains the wrapped private key and public certificate data associated + * with a certificate. + * + * @hide - not part of the public API at this time + */ + public final static class Certificate { + Certificate() {} + + /** + * Get the wrapped private key data + */ + public byte[] getWrappedPrivateKey() { return mWrappedKey; } + + /** + * Get the PEM-encoded certificate chain + */ + public byte[] getContent() { return mCertificateData; } + + private byte[] mWrappedKey; + private byte[] mCertificateData; + } + + + /** + * Process a response from the certificate server. The response + * is obtained from an HTTP Post to the url provided by getCertificateRequest. + * <p> + * The public X509 certificate chain and wrapped private key are returned + * in the returned Certificate objec. The certificate chain is in PEM format. + * The wrapped private key should be stored in application private + * storage, and used when invoking the signRSA method. + * + * @param response the opaque certificate response byte array to provide to the + * DRM engine plugin. + * + * @throws DeniedByServerException if the response indicates that the + * server rejected the request + * + * @hide - not part of the public API at this time + */ + public Certificate provideCertificateResponse(byte[] response) + throws DeniedByServerException { + return provideProvisionResponseNative(response); + } + + private static final native byte[] signRSANative(MediaDrm drm, byte[] sessionId, + String algorithm, byte[] wrappedKey, byte[] message); + + /** + * Sign data using an RSA key + * + * @param sessionId a sessionId obtained from openSession on the MediaDrm object + * @param algorithm the signing algorithm to use, e.g. "PKCS1-BlockType1" + * @param wrappedKey - the wrapped (encrypted) RSA private key obtained + * from provideCertificateResponse + * @param message the data for which a signature is to be computed + * + * @hide - not part of the public API at this time + */ + public byte[] signRSA(byte[] sessionId, String algorithm, + byte[] wrappedKey, byte[] message) { + return signRSANative(this, sessionId, algorithm, wrappedKey, message); + } + @Override protected void finalize() { native_finalize(); diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index e558c07..c3e5035 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -352,5 +352,5 @@ final public class MediaExtractor { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index 9014453..db27d09 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -42,7 +42,7 @@ public class MediaMetadataRetriever // The field below is accessed by native methods @SuppressWarnings("unused") - private int mNativeContext; + private long mNativeContext; private static final int EMBEDDED_PICTURE_TYPE_ANY = 0xFFFF; diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java index 65a9308..e5c97e7 100644 --- a/media/java/android/media/MediaMuxer.java +++ b/media/java/android/media/MediaMuxer.java @@ -65,8 +65,6 @@ import java.util.Map; final public class MediaMuxer { - private int mNativeContext; - static { System.loadLibrary("media_jni"); } @@ -84,16 +82,16 @@ final public class MediaMuxer { }; // All the native functions are listed here. - private static native int nativeSetup(FileDescriptor fd, int format); - private static native void nativeRelease(int nativeObject); - private static native void nativeStart(int nativeObject); - private static native void nativeStop(int nativeObject); - private static native int nativeAddTrack(int nativeObject, String[] keys, + private static native long nativeSetup(FileDescriptor fd, int format); + private static native void nativeRelease(long nativeObject); + private static native void nativeStart(long nativeObject); + private static native void nativeStop(long nativeObject); + private static native int nativeAddTrack(long nativeObject, String[] keys, Object[] values); - private static native void nativeSetOrientationHint(int nativeObject, + private static native void nativeSetOrientationHint(long nativeObject, int degrees); - private static native void nativeSetLocation(int nativeObject, int latitude, int longitude); - private static native void nativeWriteSampleData(int nativeObject, + private static native void nativeSetLocation(long nativeObject, int latitude, int longitude); + private static native void nativeWriteSampleData(long nativeObject, int trackIndex, ByteBuffer byteBuf, int offset, int size, long presentationTimeUs, int flags); @@ -108,7 +106,7 @@ final public class MediaMuxer { private final CloseGuard mCloseGuard = CloseGuard.get(); private int mLastTrackIndex = -1; - private int mNativeObject; + private long mNativeObject; /** * Constructor. diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 2c16b5e..41ba5d6 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -572,8 +572,8 @@ public class MediaPlayer implements SubtitleController.Listener // macro invocation in IMediaPlayer.cpp private final static String IMEDIA_PLAYER = "android.media.IMediaPlayer"; - private int mNativeContext; // accessed by native methods - private int mNativeSurfaceTexture; // accessed by native methods + private long mNativeContext; // accessed by native methods + private long mNativeSurfaceTexture; // accessed by native methods private int mListenerContext; // accessed by native methods private SurfaceHolder mSurfaceHolder; private EventHandler mEventHandler; diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 8dcbd6b..5a9d577 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -81,7 +81,7 @@ public class MediaRecorder // The two fields below are accessed by native methods @SuppressWarnings("unused") - private int mNativeContext; + private long mNativeContext; @SuppressWarnings("unused") private Surface mSurface; diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index de20227..a4d491d8 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -16,8 +16,6 @@ package android.media; -import com.android.internal.util.Objects; - import android.Manifest; import android.app.ActivityThread; import android.content.BroadcastReceiver; @@ -43,6 +41,7 @@ import android.view.Display; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; /** @@ -493,11 +492,11 @@ public class MediaRouter { boolean volumeChanged = false; boolean presentationDisplayChanged = false; - if (!Objects.equal(route.mName, globalRoute.name)) { + if (!Objects.equals(route.mName, globalRoute.name)) { route.mName = globalRoute.name; changed = true; } - if (!Objects.equal(route.mDescription, globalRoute.description)) { + if (!Objects.equals(route.mDescription, globalRoute.description)) { route.mDescription = globalRoute.description; changed = true; } diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index de3041e..53835e2 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -301,7 +301,7 @@ public class MediaScanner // 148 and up don't seem to have been defined yet. }; - private int mNativeContext; + private long mNativeContext; private Context mContext; private String mPackageName; private IContentProvider mMediaProvider; diff --git a/media/java/android/media/RemoteDisplay.java b/media/java/android/media/RemoteDisplay.java index 7afce1a..4e937a5 100644 --- a/media/java/android/media/RemoteDisplay.java +++ b/media/java/android/media/RemoteDisplay.java @@ -38,12 +38,12 @@ public final class RemoteDisplay { private final Listener mListener; private final Handler mHandler; - private int mPtr; + private long mPtr; - private native int nativeListen(String iface); - private native void nativeDispose(int ptr); - private native void nativePause(int ptr); - private native void nativeResume(int ptr); + private native long nativeListen(String iface); + private native void nativeDispose(long ptr); + private native void nativePause(long ptr); + private native void nativeResume(long ptr); private RemoteDisplay(Listener listener, Handler handler) { mListener = listener; diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 1283e9b..2616b6c 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -217,7 +217,7 @@ public class Ringtone { if (mAudioManager.getStreamVolume(mStreamType) != 0) { mLocalPlayer.start(); } - } else if (mAllowRemote) { + } else if (mAllowRemote && (mRemotePlayer != null)) { final Uri canonicalUri = mUri.getCanonicalUri(); try { mRemotePlayer.play(mRemoteToken, canonicalUri, mStreamType); @@ -239,7 +239,7 @@ public class Ringtone { public void stop() { if (mLocalPlayer != null) { destroyLocalPlayer(); - } else if (mAllowRemote) { + } else if (mAllowRemote && (mRemotePlayer != null)) { try { mRemotePlayer.stop(mRemoteToken); } catch (RemoteException e) { @@ -264,7 +264,7 @@ public class Ringtone { public boolean isPlaying() { if (mLocalPlayer != null) { return mLocalPlayer.isPlaying(); - } else if (mAllowRemote) { + } else if (mAllowRemote && (mRemotePlayer != null)) { try { return mRemotePlayer.isPlaying(mRemoteToken); } catch (RemoteException e) { diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index 06af5de..fbfc574 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -443,7 +443,7 @@ public class SoundPool { private final static String TAG = "SoundPool"; private final static boolean DEBUG = false; - private int mNativeContext; // accessed by native methods + private long mNativeContext; // accessed by native methods private EventHandler mEventHandler; private SoundPool.OnLoadCompleteListener mOnLoadCompleteListener; diff --git a/media/java/android/media/ToneGenerator.java b/media/java/android/media/ToneGenerator.java index 5592105..713f147 100644 --- a/media/java/android/media/ToneGenerator.java +++ b/media/java/android/media/ToneGenerator.java @@ -887,5 +887,5 @@ public class ToneGenerator protected void finalize() { native_finalize(); } @SuppressWarnings("unused") - private int mNativeContext; // accessed by native methods + private long mNativeContext; // accessed by native methods } diff --git a/media/java/android/media/audiofx/AudioEffect.java b/media/java/android/media/audiofx/AudioEffect.java index 1e1ef8c..cc121a3 100644 --- a/media/java/android/media/audiofx/AudioEffect.java +++ b/media/java/android/media/audiofx/AudioEffect.java @@ -315,8 +315,8 @@ public class AudioEffect { private int mId; // accessed by native methods - private int mNativeAudioEffect; - private int mJniData; + private long mNativeAudioEffect; + private long mJniData; /** * Effect descriptor diff --git a/media/java/android/media/audiofx/Visualizer.java b/media/java/android/media/audiofx/Visualizer.java index fb7f718..ff04201 100644 --- a/media/java/android/media/audiofx/Visualizer.java +++ b/media/java/android/media/audiofx/Visualizer.java @@ -184,8 +184,8 @@ public class Visualizer { private OnServerDiedListener mServerDiedListener = null; // accessed by native methods - private int mNativeVisualizer; - private int mJniData; + private long mNativeVisualizer; + private long mJniData; //-------------------------------------------------------------------------- // Constructor, Finalize diff --git a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java index f4fccbe..2b0b3e2 100644 --- a/media/java/android/media/videoeditor/MediaArtistNativeHelper.java +++ b/media/java/android/media/videoeditor/MediaArtistNativeHelper.java @@ -118,7 +118,7 @@ class MediaArtistNativeHelper { private boolean mErrorFlagSet = false; @SuppressWarnings("unused") - private int mManualEditContext; + private long mManualEditContext; /* Listeners */ diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index cf1238a..9ceefc3 100755 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -1036,7 +1036,7 @@ public class MtpDatabase { } // used by the JNI code - private int mNativeContext; + private long mNativeContext; private native final void native_setup(); private native final void native_finalize(); diff --git a/media/java/android/mtp/MtpDevice.java b/media/java/android/mtp/MtpDevice.java index 3272fed..8310579 100644 --- a/media/java/android/mtp/MtpDevice.java +++ b/media/java/android/mtp/MtpDevice.java @@ -237,7 +237,7 @@ public final class MtpDevice { } // used by the JNI code - private int mNativeContext; + private long mNativeContext; private native boolean native_open(String deviceName, int fd); private native void native_close(); diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java index f561cc0..266f78e 100644 --- a/media/java/android/mtp/MtpServer.java +++ b/media/java/android/mtp/MtpServer.java @@ -22,7 +22,7 @@ package android.mtp; */ public class MtpServer implements Runnable { - private int mNativeContext; // accessed by native methods + private long mNativeContext; // accessed by native methods static { System.loadLibrary("media_jni"); |