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

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

Android ネイティブアプリから JNI で Java のクラスや関数にアクセスするときに、定数を指定しなくてはならないケースがあります。 数値であれば、直接数値を指定する、という方法もなくはないのですが、将来問題となる危険性があります。 数値なのか文字列なのかわからない場合は、なおさら危険です。

例えば、Environment クラスの getExternalStoragePublicDirectory 関数に渡す DIRECTORY_DOWNLOADS は String ですが、 その定義を調べて文字列で指定する・・・は、少なくとも良い方法とは言えないでしょう。

ここでは、Java クラス内で static に定義された定数を取得する方法を検討(記述)しています。

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

▼ セクション一覧

JNI によるスタティックな定数の取得(JNI の準備)
JNI によるスタティックな定数の取得
その他の定数は・・・


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 の変数名ですので、ご注意ください。 取得方法は「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 呼び出し音のリストに入るオーディオファイルを置く場所。

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

▲ページ先頭へ
line
関連トピックス
line

JNI でパブリックなパスを取得する

JNI で、Download などのパブリックなパスを取得する方法について、記載しています。

JNI でウェブサイトを開く

JNI で、標準のブラウザで(あるいは1つを選択してもらって)ウェブサイトを開く方法について、記載しています。

line
その他のおすすめ
line

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

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


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