реализован ли JNI по-разному на некоторых устройствах?

#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

В частности, в более новых версиях в вашем случае будет выдаваться немного лучшее сообщение об ошибке, в котором сообщается, что вы вызвали и что вам следовало вызвать, и какой метод вы пытались вызвать.