#android #java-native-interface
#Android #java-native-interface
Вопрос:
У меня есть собственное приложение (2.2), которое работает без проблем на моем старом устройстве Motorola Droid (2.1). Недавно я приобрел новенький Sanyo Zio (2.2.1), но тот же код, который выполнялся на Droid, выдает следующую ошибку во время выполнения:
04-05 12:43:34.006: WARN/dalvikvm(901): JNI WARNING: expected return type 'I'
и затем код прерывается.
Я пытаюсь получить длинную переменную с собственной стороны с помощью следующего вызова:
static jmethodID = java_getScore = env->GetStaticMethodID(javaClass, "native_getScore", "()J");
Реализация JNI отлично работает на моем старом Droid, но не на более новом Zio.
Есть ли что-то, что я упустил из виду в своей первоначальной реализации?
Спасибо, что уделили вам время.
Ответ №1:
JNI страдает по крайней мере одним серьезным недостатком в дополнение ко многим меньшим недостаткам: он не зависит от платформы / устройства.
Еще одна проблема, из-за которой я ненавижу JNI, заключается в том, что вы не можете получить доступ к произвольным функциям в произвольных библиотеках DLL. JNI требует, чтобы вы написали клеевой слой на C / C , чтобы делать то, что вы намереваетесь делать изначально.
Итак, да, короче говоря, реализация JNI отличается на каждом устройстве.
Комментарии:
1. оказывается, что новое устройство было правильным … я вызывал CallStaticIntMethod вместо CallStaticLongMethod, а старому устройству было все равно.
Ответ №2:
Как вы, наконец, выяснили (и я тоже только что узнал), существуют разные функции для вызова методов Java из собственного кода. Они перечислены здесь: http://java.sun.com/docs/books/jni/html/functions.html#87060
Ответ №3:
Нет, JNI не реализован по-разному ни на одном из известных мне устройств. Но он меняется от выпуска к выпуску (я знаю это, потому что я часто работаю над этим). В частности, в более новых версиях, скорее всего, будет обнаружено больше ошибок в вашем коде. Лучшая защита — запускать свой код с помощью CheckJNI в новейшей версии: http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html
В частности, в более новых версиях в вашем случае будет выдаваться немного лучшее сообщение об ошибке, в котором сообщается, что вы вызвали и что вам следовало вызвать, и какой метод вы пытались вызвать.