我想在我的库项目的一个类中获取在运行时引用/托管我的库的应用程序的上下文。是否可以?如果是,如何?
谢谢
更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过 JNI 调用,我不知道如何在 JNI 中获取上下文并将其传递给 Java 层。
我想在我的库项目的一个类中获取在运行时引用/托管我的库的应用程序的上下文。是否可以?如果是,如何?
谢谢
更新 我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过 JNI 调用,我不知道如何在 JNI 中获取上下文并将其传递给 Java 层。
还有另一种方法,在您的库项目中添加应用程序类:
/**
* 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" ...>
并且您的 App 类在基础包中。
然后,您可以使用 LibApp.getContext() 您的库项目来获取正在使用该库的应用程序的应用程序上下文。
这可能不是一个好的解决方案,但它对我有用。我分享它是因为它可能对其他人有用。
是否可以?
是的。
如果是,如何?
将其作为参数传入。
我不希望我的用户将参数中的上下文传递给我的库项目,因为我的库项目可能会通过 JNI 调用,而我不知道如何在 JNI 中获取上下文并将其传递给 Java 层。
然后弄清楚“[你]如何在 JNI 中获取上下文并将其传递给 Java 层”。我想你会像传递任何其他对象一样传递它。正如@Blundell 指出的那样,您实际上没有任何其他选择。
jni中还有另外一种获取context的方式,既不是传参数也不是自己保存context,而是使用android api。我发现有一个类名为:
在源代码中。和静态函数
获取初始应用程序
可以返回一个Application
对象。但它必须在主线程中调用,并且该类是隐藏的。无论如何,您可以通过在 java 中反射来使用它。你可以使用FindClass()
andFindStaticObjectMethod()
找出方法,然后使用它。希望有帮助。
我会将它作为参数传递或在该库中传递一个单例。
让主应用程序扩展库的应用程序类是一个坏主意,因为在 java 中你只能从一个类扩展一次。如果您的应用程序需要传递到另一个库,您将遇到麻烦。