Проверка JNI-доставки логов
Linux host, без телефона и запущенного ядра. Нужны Python 3, C99-компилятор,
заголовки OpenSSL и JDK с include/jni.h. Используется настоящий
jni_bridge/android_jni_bridge.c: неиспользуемые функции отсекает ELF linker.
JNI function tables моделируют JVM, локальные ссылки и принудительные отказы;
Android logcat заменён только проверяющим приёмником диагностики.
Из корня репозитория:
python3 tools/chatgui-android/tests/jni_log/run.py
# Явный JDK / другой компилятор:
CC=clang python3 tools/chatgui-android/tests/jni_log/run.py --java-home /path/to/jdk
В Android Gradle на Linux задача :app:testJniLog запускается перед JVM-тестами
приложения, включая :app:testDebugUnitTest. На других ОС эта host-задача пропускается.
Android AttachCurrentThread принимает JNIEnv**, JDK — void** с тем же ABI;
только это различие типов допускается host-компилятором. Настоящая NDK-сборка
проверяет Android-заголовки отдельно. Host-модели не включаются в APK.
25 сценариев проверяют GetEnv/attach/detach, получение callback/class/method,
создание/копирование массивов, исходный UTF-8 с кириллицей/emoji, освобождение
всех локальных ссылок и продолжение после ошибки. Отдельно проверяются
Java-исключение callback, сохранение чужого pending exception, подавление
рекурсии и удержание local ref при замене global callback.
Для операций, допускающих NULL без Java-исключения, проверяются оба отказа.
Проверяются также пустые строки, 1024 последовательные доставки в уже attached
потоке и переключение подписки через настоящий JNI entry point.
Тест не запускает ART и не проверяет сборщик мусора Android; JVM-тест
NativeLogContractTest дополнительно сопоставляет C lookup с дескриптором
скомпилированного Kotlin onNativeLog(Int, ByteArray?, ByteArray?).
Правила JNI: Android JNI tips,
JNI function specification.