несоответствие между сигнатурой метода и фактическим вызовом - PullRequest
6 голосов
/ 21 апреля 2011

При использовании нативного интерфейса Java на Android я допустил две глупые ошибки, которые стоили мне много времени.

Имея этот метод с идентификатором:

jmethodID myMethod_methodID = env->GetMethodID(hello_Cls, "myMethod", "(ILjava/lang/String;Ljava/lang/String;I)Z");

Моя первая ошибка - это вызовиспользуя

env->CallVoidMethod

, и моя вторая ошибка называла это так:

jboolean rv = jenv->CallBooleanMethod(hello_obj, myMethod_methodID, myfirst_jstring, mysecond_jstring, 1);

, в котором явно отсутствовал аргумент jint между myMethod_methodID и myfirst_jstring.

Мне потребовалось много времени, чтобы отследить эти ошибки, потому что в logcat не было соответствующих выходных данных, и единственное поведение ничего не делало (даже не вылетало).

Итак, вопрос в следующем: Как получить более значимые ошибки для таких ошибок?

1 Ответ

4 голосов
/ 02 мая 2011

Эта страница может быть полезна: http://www.netmite.com/android/mydroid/dalvik/docs/jni-tips.html, особенно:

JNI очень мало проверяет ошибки. Вызов SetFieldInt для поля объекта будет успешным. Цель состоит в том, чтобы минимизировать накладные расходы при условии, что, если вы написали это в собственном коде, вы, вероятно, сделали это из соображений производительности.

Некоторые виртуальные машины поддерживают расширенную проверку с флагом "-Xcheck: jni". Если флаг установлен, виртуальная машина помещает другую таблицу функций в указатели JavaVM и JNIEnv. Эти функции выполняют расширенную серию проверок перед вызовом стандартной реализации.

Некоторые вещи, которые могут быть проверены:

  • Проверка на нулевые указатели там, где это не разрешено.
  • Проверка правильности типа аргумента (jclass - это объект класса, jfieldID указывает на данные поля, jstring - это java.lang.String).
  • Правильность типа поля, например не храните HashMap в поле String.
  • Проверьте, не ожидает ли исключение вызовы, где ожидающие исключения не являются законными.
  • Проверка вызовов для неподходящих функций между критическими вызовами get / release.
  • Убедитесь, что структуры JNIEnv не разделяются между потоками.
  • Убедитесь, что местные ссылки не используются за пределами допустимого срока службы.
  • Строки UTF-8 содержат действительные данные «модифицированного UTF-8».

Доступность методов и полей (то есть открытых и закрытых) не проверяется.

по ссылке: http://www.netmite.com/android/mydroid/dalvik/docs/embedded-vm-control.html

Вы можете настроить adb следующим образом:

adb shell setprop dalvik.vm.checkjni true
adb shell setprop dalvik.vm.execution-mode int:debug
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...