2013-03-11 15 views
5

Próbuję wywoływać klasy Javy przez C++/JNI na Androida. Dokładniej, próbuję wywołać konstruktora tej klasy, która jako kontekst ma kontekst Androida. Nie mam problemu z nawiązaniem połączenia, jeśli mój konstruktor nie ma parametrów, ale gdy zawarty jest niezbędny kontekst jako parametr, nie wiem, jak powinien wyglądać mój podpis JNI, a także wątpię, czy jest to możliwe, ponieważ nie mam dostęp do tego obiektu kontekstowego.Jak wywołać metodę Java z C++/JNI, która ma parametr kontekstu Androida

Moje pytanie brzmi: czy można wywołać konstruktora klasy Java, która jako jedyny parametr przyjmuje kontekst Androida? Jeśli tak to jak ? Jeśli nie, czy istnieje obejście, ponieważ potrzebuję kontekstu, aby uzyskać dostęp do określonych klas interfejsu API Androida.

+0

robi to pomoc [Użyj C++ z Androidem ndk/jni] (http://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni)? – static

Odpowiedz

2

Nie wierzę, że jest to możliwe w podany sposób. Jednak bez znajomości struktury twojej klasy, możesz zawsze stworzyć ją jako singleton ze statyczną instancją, która zostanie utworzona podczas uruchamiania twojej działalności, dzięki czemu klasa osiągnie wymagany kontekst w tym czasie. Zasadniczo byłby tam, dopóki nie będziesz gotowy do połączenia się z C++, ale rzeczywiście będzie dostępny do obsługi twojego żądania w kontekście.

+0

dzięki! działało idealnie! –

0

Uzyskując identyfikator metody konstruktora, wystarczy określić, który z nich ma być wybrany. Obecnie jesteś prawdopodobnie robi coś takiego:

constructor = (*env)->GetMethodID(env, cls, "<init>", "()V"); 
object = (*env)->NewObject(env, cls, constructor); 

Zamiast chcesz określić typ argumentu podczas używania GetMethodID i przekazać go w podczas wywoływania NewObject.

constructor = (*env)->GetMethodID(env, cls, "<init>", "(Landroid/content/Context;)V"); 
object = (*env)->NewObject(env, cls, constructor, context); 
+0

dziękuję, ale za dostarczenie składni ... jakiegokolwiek pomysłu, czy można osiągnąć kontekst bez posiadania metody java przekazać go w pierwszej kolejności? –

+0

Powinieneś przekazać jeden z Javy, tak jak to robisz w klasach Java. Chociaż może być możliwe, gdybyś był sprytny, aby zlokalizować kontekst aplikacji, nie jest to dobry projekt (i między innymi sprawiłby, że twoje zajęcia byłyby mniej testowalne). –

Powiązane problemy