// JNI関連のファイルをインクルード
#include <QtAndroidExtras/QAndroidJniObject>
#include <QtAndroidExtras/QAndroidJniEnvironment>

void MainView::MainView()
{
    QAndroidJniEnvironment env;

    // Javaクラス名の定義
    const char* JniTestClassName = "com/tnksoft/helloqt/JniTest";

    // JniTestクラスのオブジェクトを作成する。第二引数以降はコンストラクタに渡すためのもので、
    // 引数にはこのクラスのポインタを64bit整数値に変換したものを指定している。
    JniTestClass = new QAndroidJniObject(JniTestClassName, "(J)V", reinterpret_cast<jlong>(this));

    // クラスに登録されているメソッドのIDを取得して、メンバ変数として記録しておく。
    testClass = env->GetObjectClass(JniTestClass->object());
    _begin = env->GetMethodID(testClass, "begin", "()V");
    _download = env->GetMethodID(testClass, "download", "(Ljava/lang/String;)V");

    // Javaから呼び出されたときに実行するC言語関数を登録。
    // "メソッド名", "シグニチャ", "C言語関数ポインタ"の配列
    JNINativeMethod pmethods[] {
        {"error", "(JLjava/lang/String;)V", reinterpret_cast<void *>(MainView::errorCallback)},
        {"complete", "(J[B)V", reinterpret_cast<void *>(MainView::completeCallback)},
    };

    // Qtドキュメントには詳細について言及されていないが、
    // これはJNI関数「RegisterNatives」のラッパーである。
    env->RegisterNatives(testClass, pmethods, 2);

    // 静的メソッドを呼び出す。引数は見本のためのダミー数値
    jboolean res = QAndroidJniObject::callStaticMethod<jboolean>(JniTestClassName, "initialize", "(I)Z", 4);
}

void MainView::onCallJni()
{
    QAndroidJniEnvironment env;

    // 戻り値がない(void)のJavaメソッドを呼び出す
    // 例えば、戻り値がintの関数を呼び出したいのなら、callIntMethodを使用する。
    env->CallVoidMethod(JniTestClass->object(), _begin);
}
