Hallo!
Ich habe eine Methode über JNI als C++ Methode implementiert. Bisher hat alles wunderbar funktioniert, jedoch wollte ich jetzt die Methode innerhalb eines Threads aufrufen, damit währenddessen das Programm weiterlaufen kann.
Es wurde also rein der Aufruf in eine run()-Methode eines Threads verlegt, ansonsten hat sich nichts geändert.
Die Methode greift zudem auf ein Array zu, das innerhalb von Java definiert wird und in C++ mit env->GetPrimitiveArrayCritical() geholt wird. Dort wird das Array dann befüllt und innerhalb von Java wird es NUR gelesen, nicht geschrieben.
Naja, leider funktioniert das seit der Auslagerung in einen Thread so nicht mehr. Komischerweise funktioniert es beim ersten Aufruf, danach gibt es jedoch Probleme und die JavaVM stürzt ab.
Der Thread sowie die Arrays werden jedoch JEDESMAL neu erstellt, es wird also nie auf alte Objekte zugegriffen oder sowas - wie früher eben auch. Nur mit dem Unterschied, daß die Methode nun innerhalb eines Threads aufgerufen wird, der ansonsten aber nichts anstellt. Übrigens habe ich auch zwischenzeitlich mal sämtliche Lese-Operationen entfernt, sodaß die JNI-Methode tatsächlich NUR schreibt und hinterher mit diesem Array überhaupt nix mehr geschieht. Dennoch tritt beim zweiten Aufruf* ein Fehler auf (trotz dessen, daß sowohl Thread als auch Array gänzlich neue Objekte sind).
EDIT: * mit diesem zweiten Aufruf meine ich einfach nur den zeitlich gesehenen zweiten Aufruf, bei dem aber wie erwähnt ein völlig neues Array und ein völlig neuer Thread benutzt werden, und nicht die zuerst instanzierten.
Hier ein paar Code-Ausschnitte:
Weiß jemand, was ich machen kann? Mir ist klar, daß native Aufrufe und Threads leicht zu Problemen führen können, aber hier sehe ich wirklich keinen Grund dazu, zumal ich ja alle Objekte immer neu erstelle und aus dem Array gar nicht lesen muß, um das Programm zum Absturz zu bringen.
Ich habe eine Methode über JNI als C++ Methode implementiert. Bisher hat alles wunderbar funktioniert, jedoch wollte ich jetzt die Methode innerhalb eines Threads aufrufen, damit währenddessen das Programm weiterlaufen kann.
Es wurde also rein der Aufruf in eine run()-Methode eines Threads verlegt, ansonsten hat sich nichts geändert.
Die Methode greift zudem auf ein Array zu, das innerhalb von Java definiert wird und in C++ mit env->GetPrimitiveArrayCritical() geholt wird. Dort wird das Array dann befüllt und innerhalb von Java wird es NUR gelesen, nicht geschrieben.
Naja, leider funktioniert das seit der Auslagerung in einen Thread so nicht mehr. Komischerweise funktioniert es beim ersten Aufruf, danach gibt es jedoch Probleme und die JavaVM stürzt ab.
Der Thread sowie die Arrays werden jedoch JEDESMAL neu erstellt, es wird also nie auf alte Objekte zugegriffen oder sowas - wie früher eben auch. Nur mit dem Unterschied, daß die Methode nun innerhalb eines Threads aufgerufen wird, der ansonsten aber nichts anstellt. Übrigens habe ich auch zwischenzeitlich mal sämtliche Lese-Operationen entfernt, sodaß die JNI-Methode tatsächlich NUR schreibt und hinterher mit diesem Array überhaupt nix mehr geschieht. Dennoch tritt beim zweiten Aufruf* ein Fehler auf (trotz dessen, daß sowohl Thread als auch Array gänzlich neue Objekte sind).
EDIT: * mit diesem zweiten Aufruf meine ich einfach nur den zeitlich gesehenen zweiten Aufruf, bei dem aber wie erwähnt ein völlig neues Array und ein völlig neuer Thread benutzt werden, und nicht die zuerst instanzierten.
Hier ein paar Code-Ausschnitte:
Code:
// das ist der neue Thread. Davor wurde die Methode buffer(...) außerhalb aufgerufen.
private class BufferThread implements Runnable
{
private String fileName;
private int[] tempBuffer;
public BufferThread(String fileName, int[] tempBuffer)
{
this.fileName = fileName;
this.tempBuffer = tempBuffer;
}
public void run()
{
buffer(fileName, sampleSize, tempBuffer, audioData, false);
System.out.println("finished buffering " + this.toString());
}
}
Code:
// diese Methode wird innerhalb des Main-Threads aufgerufen.
// Hier wurde ursprünglich die oben angesprochene buffer()-Methode
// aufgerufen (ist jetzt auskommentiert)
protected void bufferAudioData(AudioInputStream inStream, String fileName) throws IOException
{
int tempSize = sampleSize * inStream.getFormat().getFrameSize();
int resultSize = (int) (inStream.getFrameLength() * inStream.getFormat().getFrameSize() / tempSize);
audioData = new int[resultSize];
int[] tempBuffer = new int[tempSize];
//buffer(fileName, sampleSize, tempBuffer, audioData, false);
new Thread(new BufferThread(fileName, tempBuffer)).start();
}
Code:
// so sieht die Signatur der JNI-Methode aus:
private native int buffer(String fileName, int sampleSize, int[] tempBuffer, int[] resultBuffer, boolean verbose);
Weiß jemand, was ich machen kann? Mir ist klar, daß native Aufrufe und Threads leicht zu Problemen führen können, aber hier sehe ich wirklich keinen Grund dazu, zumal ich ja alle Objekte immer neu erstelle und aus dem Array gar nicht lesen muß, um das Programm zum Absturz zu bringen.