2008-09-19 2 views
2

Java Midlet을 사용하여 노키아 휴대 전화에서 반복적으로 오디오 스 니펫을 캡처하고 싶습니다. 현재 나의 경험에 따르면 Sun의 설명서 (http://java.sun.com/javame/reference/apis/jsr135/javax/microedition/media/control/RecordControl.html 참조)의 코드를 사용하여 "while (true)"루프에서이 코드를 사용하지만 응용 프로그램이 전화의 모든 메모리를 서서히 소비하므로 결국 프로그램이 예외를 throw하고 실패합니다 추가 녹음을 시작합니다.JVM에서 메모리가 누출되지 않고 Nokia 전화 (N80/N95)에 Java MIDlet으로 오디오를 녹음 할 수 있습니까?

소비 메모리는 Java 힙 메모리가 아닙니다. 아래의 예제 프로그램은 Java 메모리가 대략 185,000 바이트 정도의 정적 인 상태를 유지하고 있음을 보여줍니다. 그러나 제공된 기본 라이브러리에서 메모리 누수가 발생합니다. Nokia에 의해; Java 응용 프로그램을 잠시 실행 한 후에 다른 (Java가 아닌) 응용 프로그램 (예 : 웹 브라우저)을 시작하면 메모리 부족에 대한 경고와 함께 해당 응용 프로그램이 종료되기 때문에 메모리 누수가 발생합니다.

필자는 설명서에서 Sun의 표준 예제 (여러 번 초기화 할 때마다 모든 것을 초기화하고 가능하면 한 번만 초기화하고 많은 할당 해제 스타일 함수를 호출해야 함) t 엄격히 필요한 등). 성공한 것으로 보이는 것은 없습니다. 아래는 간단한 예제 프로그램이지만 펌웨어 업데이트가 있더라도 N80과 N95 모두에서 15 분 정도 작동 한 후에 충돌이 발생합니다. 다른 포럼에서도이 문제를보고하지만 거기에 제시된 해결책은 작동하지 않는 것으로 나타납니다 (예 : http://discussion.forum.nokia.com/forum/showthread.php?t=129876 참조).

import javax.microedition.media.*; 
import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 
import java.io.*; 

public class Standalone extends MIDlet { 

protected void startApp() { 

final Form form = new Form("Test audio recording"); 
final StringItem status = new StringItem("Status",""); 
form.append(status); 
final Command exit = new Command("Exit", Command.EXIT, 1); 
form.addCommand(exit); 
form.setCommandListener(new CommandListener() { 
    public void commandAction(Command cmd, Displayable disp) { 
     if (cmd == exit) { 
     destroyApp(false); 
     notifyDestroyed(); 
     } 
    } 
    }); 

Thread t = new Thread(){ 
    public void run() { 
     int counter = 0; 
     while(true) { 
     //Code cut 'n' paste from Sun JSR135 javadocs for RecordControl: 
     try { 
      Player p = Manager.createPlayer("capture://audio"); 
      p.realize(); 
      RecordControl rc = (RecordControl)p.getControl("RecordControl"); 
      ByteArrayOutputStream output = new ByteArrayOutputStream(); 
      rc.setRecordStream(output); 
      rc.startRecord(); 
      p.start(); 
      Thread.currentThread().sleep(5000); 
      rc.commit(); 
      p.close(); 
     } catch (Exception e) { 
      status.setText("completed "+counter+ 
        " T="+Runtime.getRuntime().totalMemory()+ 
        " F="+Runtime.getRuntime().freeMemory()+ 
        ": Error: "+e); 
      break; 
     } 
     counter++; 
     status.setText("completed "+counter+ 
        " T="+Runtime.getRuntime().totalMemory()+ 
        " F="+Runtime.getRuntime().freeMemory()); 
     System.gc(); //One forum post suggests this, but doesn't help 
     this.yield(); 
     } 
    } 
    }; 
t.start(); 
final Display display = Display.getDisplay(this); 
display.setCurrent(form); 
} 

protected void pauseApp() {} 
protected void destroyApp(boolean bool) {} 
}  

답변

0

나는 그 문제를 해결하기 위해 bugreport를 제출해야한다고 생각합니다.

1

N 시리즈 Nokia 장치에서 알려진 메모리 누수가 있습니다. 그것은 자바에만 국한된 것이 아니며 어딘가에 OS의 하부에 있습니다.

Nokia N90을 대상으로 한 게임에서 최근에 작업 한 것과 비슷한 문제가있었습니다. 나는 여러 가지 다른 응용 프로그램을 다시 시작할 때 누적 될 수있는 메모리 문제에 직면 할 것입니다. 해결책은 게임의 전반적인 품질과 리소스의 양을 줄이는 것이 었습니다 ...

이 문제를 해결 한 새로운 버전으로 펌웨어를 업데이트하는 것이 좋습니다. 그러나 Nokia는 펌웨어를 업그레이드하는 것이 쉽지는 않지만 대부분의 경우 장치를 Nokia에 보내야합니다. 또한이 앱이 개인적인 용도로만 사용되는 것이 아니라면 N 시리즈 장치를 사용하는 사람이 최신 펌웨어를 보유하지 않을 것으로 예상해야합니다.

마지막으로, 메모리 누수 및 N 시리즈 장치와 관련된 게시물이 있다는 것을 알고 있으므로 Forum Nokia를 둘러 보는 것이 좋습니다. 여기에 문제가있는 것으로 보이는 게시물이 있습니다. 그들이 노키아 소프트웨어 업데이터와 함께 제공됩니다으로

http://discussion.forum.nokia.com/forum/showthread.php?t=123486

+0

그것은 매우 쉬운 노키아 N 시리즈 휴대폰의 펌웨어를 업데이트합니다. 나는 n95에 펌웨어를 여러 번 업데이트했다. – Jimmy

+0

N 시리즈 전화 및 모든 Nokia 전화가 2006 년 이전이고 Nokia가이 소프트웨어를 널리 알리는 데 큰 도움이되지 않았기 때문에 의견을 보내 주셔서 감사합니다. 구형 장치에서 작동하는지 알고 있습니까? – Fostah

관련 문제