お世話になっております。
こちらのサイトのページ『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; // ソフトの終了
}