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) {}
}
그것은 매우 쉬운 노키아 N 시리즈 휴대폰의 펌웨어를 업데이트합니다. 나는 n95에 펌웨어를 여러 번 업데이트했다. – Jimmy
N 시리즈 전화 및 모든 Nokia 전화가 2006 년 이전이고 Nokia가이 소프트웨어를 널리 알리는 데 큰 도움이되지 않았기 때문에 의견을 보내 주셔서 감사합니다. 구형 장치에서 작동하는지 알고 있습니까? – Fostah