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

1

У меня есть собственное приложение (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

3 ответа

1

JNI страдает, по крайней мере, одним основным недостатком в дополнение к множеству меньших недостатков: он не является платформой/устройством неспецифическим.

Другая проблема, которая заставляет меня ненавидеть JNI, заключается в том, что вы не можете получить доступ к произвольным функциям в произвольных DLL. JNI требует, чтобы вы написали слой клея в C/С++, чтобы сделать то, что вы намерены делать изначально.

Итак, да, короче говоря, реализация JNI отличается на каждом устройстве.

  • 0
    Спасибо за ваш ответ.
  • 0
    оказывается, что новое устройство было правильным ... я вызывал CallStaticIntMethod вместо CallStaticLongMethod, и старому устройству было все равно.
0

Нет, JNI не реализован по-разному на любом устройстве, о котором я знаю. Но он меняется от выпуска к выпуску (я знаю это, потому что я часто работаю над этим парнем). В частности, более новые версии, скорее всего, найдут больше ошибок в вашем коде. Лучшая защита - запустить свой код с помощью CheckJNI в новейшей версии: http://android-developers.blogspot.com/2011/07/debugging-android-jni-with-checkjni.html

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

0

Как вы, наконец, узнали (и я также выяснил), существуют разные функции, чтобы вызывать методы Java из собственного кода. Они перечислены здесь: http://java.sun.com/docs/books/jni/html/functions.html#87060

Ещё вопросы

Сообщество Overcoder
Наверх
Меню