2014-11-17 11 views
0

jar 파일을 AndroidProjector에서 처리했습니다. 다른 화면 크기를 수용하기 위해 AndroidProjector를 수정하려고하는데 org.eclipse.swt.graphics.ImageData.blit() - ArrayOutOfBoundsException 문제가 발생합니다.ArrayOutOfBoundsException (org.eclipse.swt.graphics.ImageData.blit 포함)

이 프로젝트는 솔루션의 일부로 this file (RawData)도 사용합니다.

내 안드로이드 프로젝터 호 : 여기

private void getFramebufferHeader(SocketChannel paramSocketChannel) 
throws IOException 
{ 
ByteBuffer localByteBuffer = ByteBuffer.wrap(new byte[4]); 
readAdbChannel(paramSocketChannel, localByteBuffer); 
localByteBuffer.rewind(); 
localByteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
int i = localByteBuffer.getInt(); 
int j = RawImage.getHeaderSize(i); 
localByteBuffer = ByteBuffer.wrap(new byte[j * 4]); 
readAdbChannel(paramSocketChannel, localByteBuffer); 
localByteBuffer.rewind(); 
localByteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
this.mRawImage = new RawImage(); 
this.mRawImage.readHeader(i, localByteBuffer,percentSize); 
} 

ArrayOutOfBounds 예외 :

private void updateDeviceImage(Shell paramShell, RawImage paramRawImage) 
{ 
    PaletteData localPaletteData = new PaletteData(paramRawImage.getRedMask(), paramRawImage.getGreenMask(), paramRawImage.getBlueMask()); 
//paramRawImage.getRedMask() = -16777216 
//paramRawImage.getRedMask() = 16711680 
//paramRawImage.getBlueMask() = 65289 
ImageData localImageData = null; 
//ArrayOutOfBounds Exception Here//////////////// 
//paramRawImage.width = 800 
//paramRawImage.height = 1280 
//paramRawImage.bpp = 32 
// 
localImageData = new ImageData(paramRawImage.width, paramRawImage.height, paramRawImage.bpp, localPaletteData, 1, paramRawImage.data); 
Image localImage = new Image(paramShell.getDisplay(), localImageData); 
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
///////////////////////////////////////// 
this.mImageLabel.setImage(localImage); 
this.mImageLabel.pack(); 
paramShell.pack(); 
} 

내 변성 RAWDATA 메소드 호출 (percentSize 미만 100 초과 할 때 outofbounds 예외가 발생)

public boolean readHeader(int version, ByteBuffer buf, int percentSize) { 
    this.version = version; 

    if (version == 16) { 
     // compatibility mode with original protocol 
     this.bpp = 16; 

     // read actual values. 
     this.size = buf.getInt() * percentSize/100; 
     this.width = buf.getInt() * percentSize/100; 
     this.height = buf.getInt() * percentSize/100; 


     // create default values for the rest. Format is 565 
     this.red_offset = 11 * percentSize/100; 
     this.red_length = 5 * percentSize/100; 
     this.green_offset = 5 * percentSize/100; 
     this.green_length = 6 * percentSize/100; 
     this.blue_offset = 0 ; 
     this.blue_length = 5 * percentSize/100; 
     this.alpha_offset = 0; 
     this.alpha_length = 0; 
    } else if (version == 1) { 
     this.bpp = buf.getInt(); 
     this.size = buf.getInt() * percentSize/100; 
     this.width = buf.getInt() * percentSize/100; 
     this.height = buf.getInt() * percentSize/100; 
     if (percentSize < 100) { 
      this.red_offset = 11; 
      this.red_length = 5; 
      this.green_offset = 5; 
      this.green_length = 6; 
      this.blue_offset = buf.getInt() ; 
      this.blue_length = 5; 
      this.alpha_offset = buf.getInt(); 
      this.alpha_length = buf.getInt(); 
     } else { 
      this.red_offset = buf.getInt() ; 
      this.red_length = buf.getInt(); 
      this.blue_offset = buf.getInt(); 
      this.blue_length = buf.getInt(); 
      this.green_offset = buf.getInt(); 
      this.green_length = buf.getInt(); 
      this.alpha_offset = buf.getInt(); 
      this.alpha_length = buf.getInt(); 
     } 
     /* 

     */ 
    } else { 
     // unsupported protocol! 
     return false; 
    } 

    return true; 
} 

여기 내 예외는 다음과 같습니다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16390 
at org.eclipse.swt.graphics.ImageData.blit(Unknown Source) 
at org.eclipse.swt.graphics.Image.init(Unknown Source) 
at org.eclipse.swt.graphics.Image.init(Unknown Source) 
at org.eclipse.swt.graphics.Image.<init>(Unknown Source) 
at com.google.android.AndroidProjector.updateDeviceImage(AndroidProjector.java:262) 
at com.google.android.AndroidProjector.open(AndroidProjector.java:56) 
at com.google.android.AndroidProjector.main(AndroidProjector.java:273) 
+0

디버거를 사용하여 실제로'Image' 생성자로 전달되는 인수를 식별하고 여기에 게시 할 수 있습니까? 그렇지 않으면, 다른 사람들이 당신의 프로그램에서 무슨 일이 벌어지고 있는지 말할 방법이 없습니다. –

+0

@DavidWallace - 메서드 호출에 params로 업데이트되었습니다. 모든 도움을 미리 감사드립니다. –

+0

OK,'paramShell.getDisplay()'는 무엇입니까? –

답변

0

정말 내 접근 방식으로 잘못된 나무를 짖고있었습니다. 많은 검색 결과를 얻은 후 RawImage를 사용하는 대신 셸 크기를 다시 만들고 크기를 조정했습니다.

내 코드는 지금 여기에 살고 : 다음

https://github.com/techartist/AndroidProjector

private void open() 
throws IOException 
{ 
Display.setAppName("Android Projector"); 
Display localDisplay = new Display(); 
final Shell localShell = new Shell(localDisplay); 
localShell.setText("Device Screen"); 
localShell.setSize(width,height); 
//localShell.setLocation(300, 300); 
createContents(localShell); 
localShell.addShellListener(new ShellListener() { 

    public void shellIconified(ShellEvent e) { 
    } 
    public void shellDeiconified(ShellEvent e) { 
    } 
    public void shellDeactivated(ShellEvent e) { 
    } 
    public void shellClosed(ShellEvent e) { 
     System.out.println("Client Area: " + localShell.getClientArea()); 
    } 
    public void shellActivated(ShellEvent e) { 
     int frameX = localShell.getSize().x - localShell.getClientArea().width; 
     int frameY = localShell.getSize().y - localShell.getClientArea().height; 
     if (AndroidProjector.this.mRotateImage) { 
      localShell.setSize(height * percentSize/100 + frameX, width * percentSize/100 + frameY); 
     } 
     else { 
      localShell.setSize(width * percentSize/100 + frameY,height * percentSize/100); 
     } 
    } 
});  
localShell.open(); 
SocketChannel localSocketChannel = null; 
try 
{ 
    while (!localShell.isDisposed()) { 
    if (!localDisplay.readAndDispatch()) 
    { 
     localSocketChannel = connectAdbDevice(); 
     if (localSocketChannel == null) { 
     break; 
     } 
     if (startFramebufferRequest(localSocketChannel)) 
     { 
     int frameX = localShell.getSize().x - localShell.getClientArea().width; 
     int frameY = localShell.getSize().y - localShell.getClientArea().height; 
     getFramebufferData(localSocketChannel); 
     updateDeviceImage(localShell, this.mRotateImage ? this.mRawImage.getRotated() : this.mRawImage); 
     if (this.mRotateImage) { 
      localShell.setSize(height * percentSize/100 + frameX, width * percentSize/100 + frameY); 
     } 
     else { 
      localShell.setSize(width * percentSize/100 + frameX, height * percentSize/100 + frameY); 
     } 
     } 
     localSocketChannel.close(); 
    } 
    } 
} 
finally 
{ 
    if (localSocketChannel != null) { 
    localSocketChannel.close(); 
    } 
    localDisplay.dispose(); 
} 
} 

나는 즉시 이미지 크기를 조정할 :

private void updateDeviceImage(Shell paramShell, RawImage paramRawImage) 
{ 
PaletteData localPaletteData = new PaletteData(paramRawImage.getRedMask(), paramRawImage.getGreenMask(), paramRawImage.getBlueMask()); 

ImageData localImageData = null; 
localImageData = new ImageData(paramRawImage.width, paramRawImage.height, paramRawImage.bpp, localPaletteData, 1, paramRawImage.data); 

try { 
Image localImage = new Image(paramShell.getDisplay(), localImageData); 

if (this.mRotateImage) { 

    localImage = resize(localImage,heightImage * percentSize/100 ,widthImage * percentSize/100); 
} else { 
    localImage = resize(localImage,widthImage * percentSize/100,heightImage * percentSize/100); 
} 
this.mImageLabel.setImage(localImage); 
this.mImageLabel.pack(); 
paramShell.pack(); 
} catch (Exception e) { 
    String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e); 
    //System.out.print(e.toString()); 
    System.out.print(fullStackTrace); 
    // 
} 
} 

private Image resize(Image image, int width, int height) { 
    Image scaled = new Image(Display.getDefault(), width, height); 
    GC gc = new GC(scaled); 
    gc.setAntialias(SWT.ON); 
    gc.setInterpolation(SWT.HIGH); 
    gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, 
    0, 0, width, height); 
    gc.dispose(); 
    image.dispose(); // don't forget about me! 
    return scaled; 
    } 

}