Я потратил некоторое время на изучение режима 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 значения и устанавливаю его на Gingerbread эмулятор.
Единственное различие, которое я обнаружил, это то, что предупреждения CheckJNI на эмуляторе Ice Cream Sandwich (независимо от того, какие значения были в моем файле AndroidManifest.xml) приведут к аварийному завершению работы приложения с соответствующим предупреждением - в то время как они будут выведены только на эмуляторе Gingerbread (я тестировал 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)
#На Gingerbread:
После установки приложения:
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)
Итак, мой вопрос в том, как я должен включить/выключить его - и как он должен влиять на приложение (или журналы) по-другому, когда включен?
Спасибо.