Я в конце здесь и хотел бы знать, видел ли кто-нибудь подобное при работе с 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. Идеи?