Android CheckJNI: Как включить / выключить (на эмуляторе)? Документация кажется неисправной - PullRequest
7 голосов
/ 18 января 2012

Я потратил некоторое время на изучение режима checkjni с помощью эмулятора Android в своем приложении. Хотя написано (в http://android -developers.blogspot.com / 2011/11 / jni-local-reference-changes-in-ics.html ), что CheckJNI включен по умолчанию, если debuggable = " true "& targetSdkVersion - это, по крайней мере, Ice Cream Sandwich (в файле AndroidManifest.xml). Отладочный дамп вывода CheckJNI (предупреждения и ошибки) по-прежнему печатается в DDMS, даже если я использую значения Gingerbread и устанавливаю его на Пряничный эмулятор.

Единственное различие, которое я обнаружил, заключается в том, что предупреждения CheckJNI на эмуляторе Ice Cream Sandwich (независимо от значений в моем файле AndroidManifest.xml) приведут к сбою приложения с соответствующим предупреждением - хотя они будут только напечатано в эмуляторе пряников (я проверил DeleteGlobalRef, используемый на локальной ссылке, чтобы вызвать это предупреждение).

Существует два неинформационных журнала, которые печатаются в соответствии с AndroidManifest.xml - но журналы режима CheckJNI не затрагиваются.

Вот журналы -

# В эмуляторе ICS После установки приложения:

 01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON

Loading the app:
01-19 08:32:26.617: D/dalvikvm(590): Not late-enabling CheckJNI (already on)

(The last line is printed only when debuggable="true")

01-19 08:32:27.066: I/dalvikvm(590): Turning on JNI app bug workarounds for target SDK version 10...

(The last line is printed only when targetSdkVersion=10)

При коде ошибки (сбой):

01-19 08:37:56.176: W/dalvikvm(651): JNI WARNING: DeleteGlobalRef on non-global 0x41339550 (type=1)

...

01-19 08:37:56.187: E/dalvikvm(651): VM aborting

01-19 08:37:56.187: A/libc(651): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1)

# На пряниках:

После установки приложения:

01-19 08:43:01.491: D/AndroidRuntime(32): CheckJNI is ON

Loading the app:

Нет важных журналов

При коде ошибки (без сбоев):

01-19 08:45:20.079: W/dalvikvm(304): JNI: DeleteGlobalRef(0x40608718) failed to find entry (valid=1)

Итак, мой вопрос: как мне включить / выключить его и как это должно влиять на приложение (или журналы) по-разному при включении?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Эмулятор особенный. CheckJNI всегда включен в эмуляторе.

В дополнение к вашей путанице, предупреждение DeleteGlobalRef, которое вы показываете, не было частью Pre-ICS CheckJNI. Это был небольшой отладочный вывод в старой локальной / глобальной эталонной реализации. Как часть работы ICS, она была перенесена в CheckJNI, где она, вероятно, всегда должна была быть.

Таким образом, все поведение, которое вы видите, является "ожидаемым" в буквальном смысле, даже если это несколько удивительно!

Если вы посмотрите на http://developer.android.com/guide/practices/design/jni.html, возможно, вы сможете отключить CheckJNI в эмуляторе, хотя я не уверен, почему вы захотите, поэтому я не буду поощрять вас дальше, чем тот! Что вы действительно хотите сделать, так это исправить все ошибки JNI, чтобы ваши приложения продолжали работать на будущих версиях Android: -)

(Я разочарован качеством моей диагностики "JNI WARNING: DeleteGlobalRef on non-global 0x41339550 (type = 1)") - я посмотрю о том, как быть более специфичным, чем "non-global" и удалить "type = 1", который должен как минимум соответствовать числовому значению одного из ссылочных типов в перечислении .)

Если вы ковыряетесь в этой области, см. Также http://code.google.com/p/android/issues/detail?id=21674 --- обратная совместимость для глобальных ссылок не работает; только местные ссылки. Поэтому, если установка targetSdkVersion на низкое значение не работает для вас, это может быть связано с тем, что мы все равно раздаем косвенные глобальные ссылки (даже если локальные ссылки будут прямыми).

1 голос
/ 06 марта 2013

Шаги по отключению CheckJNI на эмуляторе (проверено и работает у меня) -
1)
остановка оболочки adb
adb shell setprop dalvik.vm.checkjni false
adb shell start
2) Пусть эмулятор перезапустится на экране.
3) Установите апк. В журналах DDMS вы должны увидеть, что CheckJNI выключен.
По умолчанию при каждой установке приложения в эмуляторе показывается, что CheckJNI включен.

Эта ссылка предоставляет дополнительную информацию: http://developer.android.com/training/articles/perf-jni.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...