我希望能在我的库项目的一个类中获取引用/运行时托管了我的库的应用程序上下文。这是否可能?如果是,如何实现?
谢谢。
更新 我不希望我的用户通过参数传递上下文到我的库项目中,因为我的库项目可能通过JNI被调用,而我不知道如何在JNI中获取上下文并将其传递给Java层。
我希望能在我的库项目的一个类中获取引用/运行时托管了我的库的应用程序上下文。这是否可能?如果是,如何实现?
谢谢。
更新 我不希望我的用户通过参数传递上下文到我的库项目中,因为我的库项目可能通过JNI被调用,而我不知道如何在JNI中获取上下文并将其传递给Java层。
还有一种方法,可以在你的库项目中添加application类:
/**
* 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文件中定义了"Name":
<application android:name="App" ...>
假设你的App类位于基础包中。
然后,您可以在库项目中使用LibApp.getContext()来获取使用库的应用程序的应用程序上下文。
这可能不是好的解决方案,但它适用于我。我分享它是因为它可能对其他人有用。
这是可能的吗?
是的。
如果可以,怎么做?
将它作为参数传递。
我不想让用户通过参数传递上下文到我的库项目中,因为我的库项目可能会通过JNI调用,并且我不知道如何在JNI中获取上下文并将其传递到Java层。
那就弄清楚“如何在JNI中获取上下文并将其传递到Java层”。我认为你可以像传递其他对象一样进行传递。正如@Blundell所指出的,你确实没有其他选择。
在jni中获取上下文的另一种方法是使用android api,而不是传递参数或自己保存上下文。 我发现源代码中有一个名为:
的类。静态函数
getInitialApplication
可以返回Application
对象。但必须在主线程中调用,并且该类是隐藏的。
无论如何,您都可以通过在Java中反射来使用它。您只需使用FindClass()
和FindStaticObjectMethod()
查找方法并使用它。希望这有所帮助。