トップページ > 記事閲覧
AndroidでJavaによる文字列入力処理が出来ません
名前:焼肉 日時: 2018/09/22 13:09

お世話になっております。 こちらのサイトのページ『DXライブラリ Android版を使用した Androidアプリで Java のコードを実行する』(dxlib.o.oo7.jp/lecture/Android/Android_Java.html)を参考に複数回文字列を取得するプログラムを実装しようとしたのですがうまくいきません。 具体的には複数回ダイアログを呼び出した場合前回の文字列の入力結果が出力されてしまうようです。 たとえば、 1、画面をタップして入力画面が出し文字列を入力してOKボタンを押下する 2、入力結果が出力される 3、再び同じ動作を行う 4、3の出力結果が出力される 5、再び同じ動作を行う 6、5の出力結果が出力される この流れが理想なのですが、実際は 1、画面をタップして入力画面が出し文字列を入力してOKボタンを押下する 2、入力結果が出力される 3、再び同じ動作を行う 4、1の出力結果が出力される 5、再び同じ動作を行う 6、3の出力結果が出力される このようになってしまいます。 どのようにすれば正常な出力結果をソース内のInputStringに挿入させることが出来るでしょうか? 以下がソースです。 #include "DxLib.h" #include <string.h> #include <stdlib.h> // プログラムは android_main から始まります int android_main(void) { JNIEnv *env; const ANativeActivity *NativeActivity; char InputString[1024]; int InputEnd = 1; int tapNum = 0, beforeTapNum = 0; if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // アプリの NativeActivity を取得しておく NativeActivity = GetNativeActivity(); // メインループ while (ProcessMessage() == 0 && ClearDrawScreen() == 0) { tapNum = GetTouchInputNum(); // タッチしたら文字を入力 if (tapNum > 0 && beforeTapNum == 0 && InputEnd == 1) { InputEnd = 0; // JavaVM とソフト実行用スレッドを関連付け( C++ から Java の機能を使用するために必要 ) if (NativeActivity->vm->AttachCurrentThreadAsDaemon(&env, NULL) != JNI_OK) { return -1; } // Java のクラス (プロジェクト名) を取得 jclass jclass_KenakaGohan = env->GetObjectClass(NativeActivity->clazz); // Java のクラス (プロジェクト名) のメンバー関数 StartInputStringDialog の ID を取得 jmethodID jmethodID_StartInputDialog = env->GetMethodID(jclass_KenakaGohan, "StartInputStringDialog", "()V"); // Java のクラス (プロジェクト名) のメンバー関数 StartInputStringDialog の呼び出し env->CallVoidMethod(NativeActivity->clazz, jmethodID_StartInputDialog); // Java のクラス (プロジェクト名) の参照を削除 env->DeleteLocalRef(jclass_KenakaGohan); // JavaVM とソフト実行用スレッドの関連付け終了 NativeActivity->vm->DetachCurrentThread(); } if (InputEnd == 0) { // JavaVM とソフト実行用スレッドを関連付け( C++ から Java の機能を使用するために必要 ) if (NativeActivity->vm->AttachCurrentThreadAsDaemon(&env, NULL) != JNI_OK) { return -1; } // Java のクラス (プロジェクト名) を取得 jclass jclass_KenakaGohan = env->GetObjectClass(NativeActivity->clazz); // Java のクラス (プロジェクト名) のメンバー変数 InputEnd の ID を取得 jfieldID jfieldID_InputEnd = env->GetFieldID(jclass_KenakaGohan, "InputEnd", "I"); // Java のクラス (プロジェクト名) のメンバー変数 InputEnd の値をローカル変数 InputEnd に代入 InputEnd = env->GetIntField(NativeActivity->clazz, jfieldID_InputEnd); // InputEnd が 1 になっていたら入力が完了しているので InputString の値を取得する if (InputEnd == 1) { // Java のクラス (プロジェクト名) のメンバー変数 InputString の ID を取得 jfieldID jfieldID_InputString = env->GetFieldID(jclass_KenakaGohan, "InputString", "Ljava/lang/String;"); // Java のクラス (プロジェクト名) のメンバー変数 InputString の jstring オブジェクトを取得 jstring jstring_InputString = (jstring)env->GetObjectField(NativeActivity->clazz, jfieldID_InputString); // Java のクラス (プロジェクト名) のメンバー変数 InputString の jstring から C++ 用の文字列のアドレスを取得 const char *chars_InputString = env->GetStringUTFChars(jstring_InputString, NULL); // 文字列をローカル変数 InputString にコピー strcpy(InputString, chars_InputString); // Java のクラス (プロジェクト名) のメンバー変数 InputString の jstring から取得した C++ 用の文字列のアドレスを解放 env->ReleaseStringUTFChars(jstring_InputString, chars_InputString); // Java のクラス (プロジェクト名) のメンバー変数 InputString の jstring オブジェクトの参照を削除 env->DeleteLocalRef(jstring_InputString); } // Java のクラス (プロジェクト名) の参照を削除 env->DeleteLocalRef(jclass_KenakaGohan); // JavaVM とソフト実行用スレッドの関連付け終了 NativeActivity->vm->DetachCurrentThread(); } clsDx(); printfDx("Str %s", InputString); beforeTapNum = tapNum; // 裏画面の内容を表画面に反映 ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: AndroidでJavaによる文字列入力処理が出来ません ( No.1 )
名前:管理人 日時:2018/09/23 00:46

『DXライブラリ Android版を使用した Androidアプリで Java のコードを実行する』の内容は文字列入力を1度しか行わない 前提の Java のプログラムとなっていたことが原因です 具体的には Java のプログラムの int InputEnd ; が、一度入力が終わるとずっと 1 のままになるので、 文字列入力の終了が正しく判定されていないのが原因です StartInputStringDialog の冒頭で InputEnd に 0 を代入するように解説ページのプログラムを修正しましたので よろしければお試しください m(_ _;m <DXライブラリ Android版を使用した Androidアプリで Java のコードを実行する> https://dxlib.xsrv.jp/lecture/Android/Android_Java.html
メンテ
Re: AndroidでJavaによる文字列入力処理が出来ません ( No.2 )
名前:焼肉(解決済み) 日時:2018/09/23 08:41

おかげで出来ました。 ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存