Je voudrais obtenir le contexte de l'application qui a référencé/hébergé ma bibliothèque au moment de l'exécution dans une classe de mon projet de bibliothèque. C'est possible? Si oui, comment?
Merci
Mise à jour Je ne veux pas que mon utilisateur passe le contexte en paramètre à mon projet de bibliothèque car il est possible que mon projet de bibliothèque soit appelé via JNI et je n'ai aucune idée de comment obtenir du contexte dans JNI et passez-le à Java layer.
C'est possible?
Oui.
Si oui, comment?
Passez-le comme paramètre.
Je ne veux pas que mon utilisateur passe le contexte en paramètre à mon projet de bibliothèque car il est possible que mon projet de bibliothèque soit appelé via JNI et je n'ai aucune idée de comment obtenir du contexte dans JNI et le transmettre à Java.
Ensuite, déterminez "comment [vous] pouvez obtenir du contexte dans JNI et le transmettre à Java layer". J'imagine que vous le passeriez comme n'importe quel autre objet. Comme l'a noté @Blundell, vous le faites pas vraiment d'autre option.
Il y a une autre façon, ajoutez une classe d'application dans votre projet de bibliothèque:
/**
* Base class for those who need to maintain global application state.
*/
public class LibApp extends Application {
/** Instance of the current application. */
private static LibApp instance;
/**
* Constructor.
*/
public LibApp() {
instance = this;
}
/**
* Gets the application context.
*
* @return the application context
*/
public static Context getContext() {
return instance;
}
}
Ensuite, dans votre projet normal, faites en sorte que la vraie classe d'application étende LibApp:
/**
* Base class for those who need to maintain global application state.
*/
public class App extends LibApp {
@Override
public void onCreate() {
super.onCreate();
}
}
Assurez-vous que "Nom" est défini dans AndroidManifest:
<application Android:name="App" ...>
et que votre classe App est dans le package de base.
Vous pouvez ensuite utiliser LibApp.getContext () votre projet de bibliothèque pour obtenir le contexte d'application de l'application qui utilise la bibliothèque.
Ce n'est peut-être pas une bonne solution, mais cela fonctionne pour moi. Je le partage parce qu'il pourrait être utile à quelqu'un d'autre.
Il existe une autre façon d'obtenir du contexte dans jni, sans passer de paramètre ni enregistrer le contexte par vous-même, mais en utilisant Android api. J'ai trouvé qu'il y avait une classe nommée:
dans le code source. Et la fonction statique
getInitialApplication
peut renvoyer un objet Application
. Mais il doit être appelé dans le thread principal et la classe est masquée. Quoi qu'il en soit, vous pouvez l'utiliser en réfléchissant en Java. Et vous pouvez simplement utiliser FindClass()
et FindStaticObjectMethod()
pour découvrir la méthode et l'utiliser. J'espère que cela pourra aider.
Selon cet article vous pouvez laisser la bibliothèque s'initialiser automatiquement avec le contexte de l'application à l'aide d'un ContentProvider
.
Soyez prudent de toute façon, comme décrit dans post comments , il peut y avoir des inconvénients concernant le temps de chargement et l'exécution instantanée, ainsi que des plantages sur les applications multi-processus.
HTH
Dans votre projet de bibliothèque, ajoutez une dépendance à votre projet principal. Dans IntelliJ, il le fera pour vous lorsque vous essayez de référencer cette variable globale. Dans Eclipse, je ne suis pas sûr ...
Je le passerais comme paramètre ou lui passerais un singleton dans cette bibliothèque.
Avoir l'application principale pour étendre la classe d'application de la bibliothèque est une mauvaise idée car Java vous ne pouvez étendre qu'une seule fois à partir d'une classe. Si votre application nécessite de passer à une autre bibliothèque, vous aurez des ennuis.