Android上神秘的JNI行为

时间:2012-01-25 00:53:57

标签: android android-ndk java-native-interface

我在这里结识,想知道在Android中使用JNI时是否有人看到过类似内容。我发现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返回,否则我根本无法使代码工作。想法?

0 个答案:

没有答案