このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成日 January 11, 2018、最終更新日 July 24, 2018(様式変更)
トップページ > Android 開発トップ > JNI によるスタティックな定数の取得

ここでは、JNI によるスタティックな定数の取得方法を記載しています。

Android ネイティブアプリから JNI で Java のクラスや関数にアクセスするときに、定数を指定しなくてはならないケースがあります。 数値であれば、直接数値を指定する、という方法もなくはないのですが、将来問題となる危険性があります。 数値なのか文字列なのかわからない場合は、なおさら危険です。
例えば、Environment クラスの getExternalStoragePublicDirectory 関数に渡す DIRECTORY_DOWNLOADS は String ですが、 その定義を調べて文字列で指定する・・・は、少なくとも良い方法とは言えないでしょう。
ここでは、Java クラス内で static に定義された定数を取得する方法を検討(記述)しています。

このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ず
プライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

JNI によるパブリックなパスの取得(JNI の準備)

投稿 December 22, 2017, 最終更新 July 24, 2018(様式変更)

ここでは、getExternalStoragePublicDirectory 関数に渡す、 DIRECTORY_DOWNLOADS シンボルの値を取得します。

JNI ( Java と他の言語をつなぐ Java Native Interface の略です ) を利用しますので、Java Virtual Machine を準備しておく必要があります。

JVM ( Java Virtual Machine ) の準備はいつでも同じです。
詳しくは、JNI によるパブリックなパスの取得に記載していますので、必要でしたら、参照してください。

JNIEnv* env;
JavaVM *vm = app->activity->vm;
vm->AttachCurrentThread(&env, NULL);
JavaVM *vm = g_app->activity->vm;
vm->DetachCurrentThread();

上記いずれも、メインスレッドから呼び出すことを想定しています。

▲ページ先頭へ

JNI によるスタティックな定数の取得

投稿 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 の変数名ですので、ご注意ください。

これで、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 呼び出し音のリストに入るオーディオファイルを置く場所。

将来、増えたり減ったりする可能性もありますので、ご注意ください。
また、(古い機種のせいか)初期状態では存在しないフォルダもあるようですので、あわせてご注意ください。

▲ページ先頭へ


関連トピックス
JNI でパブリックなパスを取得する


その他のおすすめ
おすすめ記事はありません。

JavaScriptが無効です
▲ページ先頭へ

© 2017-2018 StraightApps.com 無断転載を禁じます。No reproduction without permission.