таинственное поведение JNI на Android - PullRequest
0 голосов
/ 25 января 2012

Я в конце здесь и хотел бы знать, видел ли кто-нибудь подобное при работе с JNI в Android. Я обнаружил, что CallVoidMethod () не работает для меня, если у метода void java также не было параметров. Однако, если я просто изменю целевой java-метод, чтобы он возвращал int, то CallIntMethod () работает просто отлично. Это не конец света, но я бы хотел опустить пустое возвращаемое значение int, если смогу, просто для простоты и правильности. Ниже приведены два (почти эквивалентных) фрагмента кода:

// Example One - this works fine!

// java object method
public int java_callback(int value)
{
    assert(value == 666);
    return 0; // useless
}

// cpp native function
void cpp_callback()
{
    // JNI globals
    // g_jvm cached as is
    // g_cls cached as GlobalRef
    // g_obj cached as GlobalRef

    JNIEnv *env;
    g_jvm->AttachCurrentThread(&env, NULL);
    jmethodID mid = env->GetMethodID(g_cls, "java_callback", "(I)I");
    env->CallIntMethod(g_obj, mid, 666);
}

// Example Two - this doesn't work!?

// java object method
public void java_callback(int value)
{
    assert(value == 666); // never gets here
}

// cpp native function
void cpp_callback()
{
    // JNI globals
    // g_jvm cached as is
    // g_cls cached as GlobalRef
    // g_obj cached as GlobalRef

    JNIEnv *env;
    g_jvm->AttachCurrentThread(&env, NULL);
    jmethodID mid = env->GetMethodID(g_cls, "java_callback", "(I)V");
    env->CallVoidMethod(g_obj, mid, 666);
}

Позвольте мне подчеркнуть, что первый пример действительно работает, поэтому здесь нет никаких внешних проблем. Я просто не могу заставить код работать, если у меня нет фиктивного возврата int. Идеи?

...