У меня есть собственное приложение (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.
Есть ли что-то, что я забыл в своей первоначальной реализации?
Спасибо за ваше время.
JNI страдает, по крайней мере, одним основным недостатком в дополнение к множеству меньших недостатков: он не является платформой/устройством неспецифическим.
Другая проблема, которая заставляет меня ненавидеть JNI, заключается в том, что вы не можете получить доступ к произвольным функциям в произвольных DLL. JNI требует, чтобы вы написали слой клея в C/С++, чтобы сделать то, что вы намерены делать изначально.
Итак, да, короче говоря, реализация JNI отличается на каждом устройстве.
Нет, JNI не реализован по-разному на любом устройстве, о котором я знаю. Но он меняется от выпуска к выпуску (я знаю это, потому что я часто работаю над этим парнем). В частности, более новые версии, скорее всего, найдут больше ошибок в вашем коде. Лучшая защита - запустить свой код с помощью CheckJNI в новейшей версии: http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html
В частности, более новые версии сообщают вам немного лучшее сообщение об ошибке в вашем случае, сообщая вам, что вы назвали, и что вы должны были назвать, и какой метод вы пытались вызвать.
Как вы, наконец, узнали (и я также выяснил), существуют разные функции, чтобы вызывать методы Java из собственного кода. Они перечислены здесь: http://java.sun.com/docs/books/jni/html/functions.html#87060