import java.util.*;
import java.io.*;
import java.nio.*;
 
public final class NioTest {
    
    static native void initStandardNative( int byteArrayWidth );
    static native void initAdvancedNative( ByteBuffer theBuffer );
    static native int callStandardNative( byte [] bytes );  
    static native int callStandardNativeC( byte [] bytes );  
    static native int callAdvancedNative( );  
    static ByteBuffer theByteBuffer; 
    static byte [] bBuffer; 
    
    static  {
        System.loadLibrary("niotest");
    }    


    public static long computeArray(byte [] buffer) {
        long rv = 0;
        for (int i=0; i<buffer.length; i++) {    
            buffer[0] += i;            
            rv += buffer[i];
        }                
        return rv;
    }
        
    public static long runAdvanced(int nTimes) {
        long rv = 0;
        theByteBuffer = ByteBuffer.allocateDirect(48300);
        initAdvancedNative(theByteBuffer);
        for (int i=0; i<nTimes; i++) {    
            rv += callAdvancedNative();
        }
        return rv;
    }

    public static long copyStandard(int nTimes) {
        long rv = 0;
        initStandardNative(bBuffer.length);
        for (int i=0; i<nTimes; i++) {    
            rv += callStandardNativeC(bBuffer);
        }
        return rv;
    }


    public static long runStandard(int nTimes) {
        long rv = 0;
        initStandardNative(bBuffer.length);
        for (int i=0; i<nTimes; i++) {    
            rv += callStandardNative(bBuffer);
        }
        return rv;
    }
    
    public static long runJava(int nTimes) {
        long rv = 0;
        for (int i=0; i<nTimes; i++) {    
            rv += computeArray(bBuffer);
        }
        return rv;
    }

    
    public static void main(String [] args) {     
            bBuffer = new byte[48300];
            
            long rv = 0;
            long st = System.currentTimeMillis(); 
            if (args[0].equals("j"))
                rv = runJava( Integer.parseInt(args[1]));             
            else if (args[0].equals("s"))
                rv = runStandard( Integer.parseInt(args[1]));             
            else if (args[0].equals("c"))
                rv = copyStandard( Integer.parseInt(args[1]));             
            else if (args[0].equals("a"))
                rv = runAdvanced( Integer.parseInt(args[1]));             
                
            long et = System.currentTimeMillis(); 
            System.out.println("Test finished in " + new Long(et-st).toString() + " ms");             
            System.out.println("Returned value is " + new Long(rv).toString());             
    }
    
}
