ライブラリプロジェクトの1つのクラス内で実行時にライブラリを参照/ホストしているアプリケーションのコンテキストを取得したい。出来ますか?はいの場合、どのように?
ありがとう
更新ライブラリプロジェクトがJNIを介して呼び出される可能性があり、JNIでコンテキストを取得する方法がわからないため、ユーザーがライブラリプロジェクトにコンテキストを渡すことを望まないそれをJava layer。
出来ますか?
はい。
はいの場合、どのように?
パラメータとして渡します。
ライブラリプロジェクトがJNIを介して呼び出される可能性があり、JNIでコンテキストを取得してJavaレイヤー。
次に、「JNIでコンテキストを取得してJavaレイヤー]に渡す方法」を理解します。他のオブジェクトと同じように渡すと思います。@ Blundellが述べたように、実際には他のオプションはありません。
ライブラリプロジェクトにアプリケーションクラスを追加するもう1つの方法があります。
/**
* 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でコンテキストを取得する別の方法があります。パラメータを渡すこともコンテキストを保存することも、自分ではなくAndroid apiを使用します。
ソースコード内。そして静的関数
getInitialApplication
Application
オブジェクトを返すことができます。ただし、メインスレッドで呼び出す必要があり、クラスは非表示になっています。とにかく、Javaに反映して使用できます。そして、FindClass()
とFindStaticObjectMethod()
を使用してメソッドを見つけ、使用することができます。お役に立てば幸いです。
この投稿 によれば、ContentProvider
を使用して、ライブラリをアプリケーションコンテキストで自動初期化できます。
とにかく注意してください post comments で説明されているように、マルチプロセスアプリでのクラッシュだけでなく、読み込み時間とインスタントランに関する欠点があるかもしれません。
HTH
ライブラリプロジェクトで、メインプロジェクトに依存関係を追加します。 IntelliJでは、このグローバル変数を参照しようとすると自動的に実行されます。 Eclipseではわかりません...
パラメータとして渡すか、そのライブラリのシングルトンを渡します。
メインアプリケーションアプリケーションにライブラリのアプリケーションクラスを拡張させることは、Javaで1つのクラスから1回しか拡張できないため、お勧めできません。アプリケーションが別のライブラリに渡す必要がある場合、問題が発生します。