Methodenaufrufe mit Parametern zwischenspeichern
-
Ich habe eine Android-Anwendung mit nativem C++ Code und möchte Java-seitig verschiedenen Methoden der C++ Objekte über JNI aufrufen. Diese möchte ich jedoch nicht sofort, sondern erst beim nächsten update meines C++ Systems verarbeiten. Wie kann ich am besten die seit dem letzten update Java-seitig ausgelösten Methodenaufrufe mit den Parametern zwischenspeichern?
-
Eine einfache Lösung wäre es, für jedes Objekt OP-Codes festzulegen und den Klassen dann zu sagen, was sie tun sollen.
Kleines Beispiel:class Foobar { public: enum eOpCode { OP_FOO, OP_BAR, } void foo(int x) { std::cout << "foo" << std::endl; } void bar(int x) { std::cout << "bar" << std::endl; } void storeAction(eOpCode code, int param) { // Aktion speichern } void executeActions() { for each item in actionList switch(opCode) case OP_FOO: this->foo(item->getParam()); break; case OP_BAR: this->bar(item->getParam()); end } };Das ist jetzt pseudo code, aber ich denke du weisst worauf ich hinauswill.
Wäre jetzt meine (einfache) Methode. Die Parameter könnte man ja kapseln mit boost::any oder sowas ähnlichem.
Allerdings weiss ich nicht wieviel Rechenkraft man auf einem Handy für sowas hat.Eine andere Möglichkeit wäre es natürlich, die Klasse so zu designen, dass sie bei einem Aufruf der Funktionen nur die Parameter übernehmen und der eigentliche Vorgang erst beim Aufruf einer Funktion execute() gestartet wird.
-
Wenn dein Compiler TR1 beherrscht, halte dir eine Queue der Form
std::queue<std::tr1::function<void()> >Dann kannst du mit std::tr1::bind Parameter an Funktionen binden und das Ergebnis darin ablegen. Wenn der Zeitpunkt der Ausführung kommt, hol sie aus der Queue und führ sie aus.
Wenn dein Compiler TR1 nicht beherrscht, gibt es all das auch in Boost.
Wichtig beim Umgang mit Referenzen und Zeigern: die betreffenden Objekte müssen zum Zeitpunkt der Ausführung natürlich noch gültig sein.