/* * @(#)NBA.java 1.6 03/04/25 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media; public final class NBA { private long data; private int size; private Class type = null; private Object javaData = null; private int atype = 1; static { try { JMFSecurityManager.loadLibrary( "jmutil"); } catch (Throwable t) { } } public NBA(Class type, int size) { this.type = type; this.size = size; if (type == short[].class) { atype = 2; size *= 2; } else if (type == int[].class) { atype = 4; size *= 4; } else if (type == long[].class) { atype = 8; size *= 8; } //System.err.println("NBA.constructor allocating " + size); data = nAllocate(size); if (data == 0) throw new OutOfMemoryError("Couldn't allocate native buffer"); } protected synchronized final void finalize() { if (data != 0) nDeallocate(data); data = 0; } public synchronized Object getData() { if (javaData == null) { if (type == byte[].class) javaData = new byte[size]; else if (type == short[].class) javaData = new short[size]; else if (type == int[].class) javaData = new int[size]; else if (type == long[].class) javaData = new long[size]; else { System.err.println("NBA: Don't handle this data type"); return null; } } //Thread.dumpStack(); //System.err.println("NBA.getData"); nCopyToJava(data, javaData, size, atype); return javaData; } public synchronized Object clone() { NBA cl = new NBA(type, size); nCopyToNative(data, cl.data, size); return cl; } public synchronized void copyTo(NBA nba) { if (nba.size >= size) { nCopyToNative(data, nba.data, size); } } public synchronized void copyTo(byte [] javadata) { if (javadata.length >= size) { nCopyToJava(data, javadata, size, atype); } } public synchronized long getNativeData() { return data; } public int getSize() { return size; } private native long nAllocate(int size); private native void nDeallocate(long data); private native void nCopyToNative(long indata, long outdata, int size); private native void nCopyToJava(long indata, Object outdata, int size, int atype); }