Android ネイティブアプリから JNI で Java のクラスや関数にアクセスするときに、定数を指定しなくてはならないケースがあります。 数値であれば、直接数値を指定する、という方法もなくはないのですが、将来問題となる危険性があります。 数値なのか文字列なのかわからない場合は、なおさら危険です。
例えば、Environment クラスの getExternalStoragePublicDirectory 関数に渡す DIRECTORY_DOWNLOADS は String ですが、 その定義を調べて文字列で指定する・・・は、少なくとも良い方法とは言えないでしょう。
ここでは、Java クラス内で static に定義された定数を取得する方法を検討(記述)しています。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。
投稿 December 22, 2017, 最終更新 July 24, 2018(様式変更)
ここでは、getExternalStoragePublicDirectory 関数に渡す、 DIRECTORY_DOWNLOADS シンボルの値を取得します。
詳しくは、「JNI によるパブリックなパスの取得」に記載していますので、必要でしたら、参照してください。
JNIEnv* env; JavaVM* vm = app->activity->vm; vm->AttachCurrentThread(&env, NULL);
JavaVM* vm = g_app->activity->vm; vm->DetachCurrentThread();
上記いずれも、メインスレッドから呼び出すことを想定しています。
投稿 January 11, 2018, 最終更新 July 24, 2018(様式変更)
Android Developers の Environment(android.os.Environment)を見ると、 DIRECTORY_DOWNLOADS は、public static の String(java.lang.String)となっています。
DIRECTORY_DCIM や、DIRECTORY_PICTURES も同じです。
static なフィールドを得るには、env の GetStaticFieldID 関数を使用します。
Environment クラスを取得し、 目的のフィールドのIDを取得して、その値を取得する、という形になるようです。
jclass environmentClass = env->FindClass("android/os/Environment"); jfieldID fieldID = env->GetStaticFieldID(environmentClass, "DIRECTORY_DOWNLOADS", "Ljava/lang/String;"); jobject DIRECTORY_DOWNLOADS = env->GetStaticObjectField(environmentClass, fieldID);
jobject(実質は String)の DIRECTORY_DOWNLOADS(これはただの変数名です)を得られたら、 getExternalStoragePublicDirectory 関数(static)を呼び出せます。 戻り値は、 File(java.io.File)オブジェクトです。
jobject fileObject = env->CallStaticObjectMethod(environmentClass, getExternalStoragePublicDirectory, DIRECTORY_DOWNLOADS);
引数の getExternalStoragePublicDirectory は、同関数を指す jmethodID の変数名ですので、ご注意ください。 取得方法は「JNI でパブリックなパスを取得する」に書いています。
これで、File の getPath 関数で、絶対パスを String(java.lang.String)で、取得できます。
DIRECTORY_DOWNLOADS では、
/storage/emulated/0/Download
を取得できました。
投稿 July 24, 2018
Environment には、他にどのような(ディレクトリを示す)定数があるのかを調べました。
Android Developers の Environment クラスの説明に記述があります。 リンク先は英語ですので簡単に記載します。正確にはリンク先のページをご覧ください。
DIRECTORY_ALARMS 音楽ではなくアラームのリストに入るオーディオファイルを置く場所。
DIRECTORY_DCIM 写真とビデオファイルを置く場所。
DIRECTORY_DOCUMENTS ユーザーが作成したドキュメントファイルを置く場所。
DIRECTORY_DOWNLOADS ユーザーがダウンロードしたファイルを置く場所。
DIRECTORY_MOVIES ユーザーが利用可能なムービーファイルを置く場所。
DIRECTORY_MUSIC 音楽ファイルを置く場所。
DIRECTORY_NOFITICATIONS 音楽ではなく通知のリストに入るオーディオファイルを置く場所。
DIRECTORY_PICTURES ユーザーが利用可能な画像ファイルを置く場所。
DIRECTORY_PODCASTS ポッドキャストのリストに入るオーディオファイルを置く場所。
DIRECTORY_RINGTONES 呼び出し音のリストに入るオーディオファイルを置く場所。
将来、増えたり減ったりする可能性もありますので、ご注意ください。
また、(古い機種など?)初期状態では存在しないフォルダもあるようですので、あわせてご注意ください。
おすすめ記事はありません。