Moin!
Ich habe ein in C geschriebens Media Player Backend, welches ich nun versuche auf mittels NDK auf Android zu portieren. Da ich noch nie zuvor mit JNI gearbeitet habe, muss ich mir entsprechend auch alles nötige zusammensuchen, wodurch ich nun vor einem für mich und mein Wissen nicht nachvollziehbaren Problem stehe.
Der C Code des Backends funktioniert soweit Problemlos. Derzeit versuche ich also eine Brücke zwischen Android und C zu schaffen. Nun nehmen wir mal folgende Situation: Der Media Player gibt stets irgendwelche Audiodateien wieder, die View soll also anzeigen welcher Song gerade läuft, wie lange der geht, wie lange er schon abgespielt wird, seine Position innerhalb der Playlist, Cover, ...
Nun habe ich mir hierfür eine Callback Methode gebaut, die an diversen Stellen im Player aufgerufen wird, über die diee entsprechenden Informationen an Android weitergegeben werden. Diese sieht bislang wie folgt aus:
Nun kann ich lustig in meinem Media Player zwischen den Titeln in der Playlist hin und her wechseln, bekomme brav Cover, Artist und Titel angezeigt, und alles funktioniert wunderbar. Bis auf eine Ausnahme:
Sobald der Player einen Titel zu ende gespielt hat, und den nächsten anfängt, ruft er diesen Callback auf und übergibt die Daten des neuen Stücks. Und in genau dieser Situation, und das ist auch die einzige Situation wo das passiert, crasht die ganze App beim Aufruf von CallVoidMethod, und das OHNE jegliche Fehlermeldung warum. Zumindest spuckt mir der Log nichts aus. Die App hört einfach mit der Wiedergabe auf und ist weg vom Fenster.
Ich hab nun sämtliche Nachforschungen angestellt wieso sie sich so verhält, könnte ja sein dass vom Player keine Daten kommen, oder irgendwo irgendein Müll geliefert wird. Aber nichts, alle Daten kommen sauber rein, und es gibt keinen erkenntlichen Grund für mich wieso mir die App da crasht.
Hat jemand von Euch vlt. einen Tip für mich?
Und dann wäre da noch ein weiters Problem: Wenn ich nun die Callback Methode um int position und die Signatur auf
erweiter bekomme den nächsten Crash mit einer NoSuchMethodError Fatal Exception. Dabei steht I doch für int, oder nicht? Was läuft denn da wieder falsch?
Ich Danke Euch schonmal im voraus!
Ich habe ein in C geschriebens Media Player Backend, welches ich nun versuche auf mittels NDK auf Android zu portieren. Da ich noch nie zuvor mit JNI gearbeitet habe, muss ich mir entsprechend auch alles nötige zusammensuchen, wodurch ich nun vor einem für mich und mein Wissen nicht nachvollziehbaren Problem stehe.
Der C Code des Backends funktioniert soweit Problemlos. Derzeit versuche ich also eine Brücke zwischen Android und C zu schaffen. Nun nehmen wir mal folgende Situation: Der Media Player gibt stets irgendwelche Audiodateien wieder, die View soll also anzeigen welcher Song gerade läuft, wie lange der geht, wie lange er schon abgespielt wird, seine Position innerhalb der Playlist, Cover, ...
Nun habe ich mir hierfür eine Callback Methode gebaut, die an diversen Stellen im Player aufgerufen wird, über die diee entsprechenden Informationen an Android weitergegeben werden. Diese sieht bislang wie folgt aus:
Java:
jobject *callbackCurrentTitleObject = NULL;
JNIEnv *callbackCurrentTitleEnv = NULL;
Java:
void currentTitleCallbackint position, char *cover, char *artist, char *title, double start, double end) {
if(callbackCurrentTitleEnv != NULL && callbackCurrentTitleObject != NULL) {
jclass cls = (*callbackCurrentTitleEnv )->GetObjectClass(callbackCurrentTitleEnv , callbackCurrentTitleObject);
jmethodID mid = (*callbackCurrentTitleEnv )->GetMethodID(callbackCurrentTitleEnv , cls, "callbackCurrentTitle", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
if(mid == 0) {
return;
}
(*callbackCurrentTitleEnv )->CallVoidMethod(
callbackCurrentTitleEnv ,
callbackCurrentTitleObject ,
mid,
(*callbackCurrentTitleEnv )->NewStringUTF(callbackCurrentTitleEnv , cover),
(*callbackCurrentTitleEnv )->NewStringUTF(callbackCurrentTitleEnv , artist),
(*callbackCurrentTitleEnv )->NewStringUTF(callbackCurrentTitleEnv , title)
);
}
}
Java:
void Java_com_android_mediaplayer_MPLService_callbackCurrentTitle(JNIEnv *env, jobject javaThis) {
callbackCurrentTitleEnv = env;
callbackCurrentTitleObject = javaThis;
}
Sobald der Player einen Titel zu ende gespielt hat, und den nächsten anfängt, ruft er diesen Callback auf und übergibt die Daten des neuen Stücks. Und in genau dieser Situation, und das ist auch die einzige Situation wo das passiert, crasht die ganze App beim Aufruf von CallVoidMethod, und das OHNE jegliche Fehlermeldung warum. Zumindest spuckt mir der Log nichts aus. Die App hört einfach mit der Wiedergabe auf und ist weg vom Fenster.
Ich hab nun sämtliche Nachforschungen angestellt wieso sie sich so verhält, könnte ja sein dass vom Player keine Daten kommen, oder irgendwo irgendein Müll geliefert wird. Aber nichts, alle Daten kommen sauber rein, und es gibt keinen erkenntlichen Grund für mich wieso mir die App da crasht.
Hat jemand von Euch vlt. einen Tip für mich?
Und dann wäre da noch ein weiters Problem: Wenn ich nun die Callback Methode um int position und die Signatur auf
Code:
(I;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
Ich Danke Euch schonmal im voraus!