是否有可能在Android库项目中获取应用程序的上下文?

我想在我的图书馆项目的一个类中获得运行时引用/托pipe我的图书馆的应用程序的上下文。 可能吗? 如果是的话,怎么样?

谢谢

更新我不希望我的用户将参数的上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层。

可能吗?

是。

如果是的话,怎么样?

将其作为参数传入。

我不希望我的用户将参数上下文传递给我的库项目,因为我的库项目可能会通过JNI调用,我不知道如何在JNI中获取上下文并将其传递给Java层。

然后找出“如何在JNI中获取上下文并将其传递给Java层”。 我会想象你会像任何其他物体一样传递它。 正如@Blundell指出的那样,你没有其他的select。

还有一种方法,在你的库项目中添加应用程序类:

/** * 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; } } 

然后在您的常规项目中使真正的应用程序类扩展LibApp:

 /** * Base class for those who need to maintain global application state. */ public class App extends LibApp { @Override public void onCreate() { super.onCreate(); } } 

确保您在AndroidManifest中定义了“名称”:

 <application android:name="App" ...> 

并且你的应用程序类在基础包中。

然后,您可以使用LibApp.getContext()库项目来获取使用该库的应用程序的应用程序上下文。

这可能不是一个好的解决scheme,但它适用于我。 我分享它,因为它可能对其他人有用。

还有另外一种方法可以在jni中获取上下文,既不传递参数也不保存上下文,而是使用android api。 我发现有一个类名为:

  • android.app.AppGlobals

在源代码中。 和静态function

  • getInitialApplication

    可以返回一个Application对象。 但是它必须在主线程中调用,而类是隐藏的。 无论如何,你可以通过反映在java中使用它。 你可以使用FindClass()FindStaticObjectMethod()来找出方法,并使用它。 希望有所帮助。

在你的库项目中添加一个依赖到你的主项目。 在IntelliJ中,当你试图引用这个全局variables时,它会为你做。 在Eclipse中,我不确定…

我会把它作为一个parameter passing,或者把它传递给这个库中的一个单例。

让主应用程序扩展库的应用程序类是一个糟糕的主意,因为在java中你只能从类中扩展一次。 如果您的应用程序需要传递给另一个库,您将遇到麻烦。