РЕДАКТИРОВАТЬ: мне удалось построить x86_64 версию libreactnativejni.so
(см. Мой ответ).Однако это не решило мою проблему.
Подводя итог тому, что я узнал здесь:
Вы не можете тестировать компоненты Android, которые используют собственные библиотеки в Linux, потому что "libandroid.so"(ядро android lib), для Linux не существует.
Оригинальный вопрос:
Моя цель - запустить тесты на моем Linux-боксе, используя PowerMockito, похожий на RootViewTest.java .Не уверен, как реал-нативной команде удалось запустить этот тест, но из моего опыта насмешка Arguments.createArray
невозможна без загрузки библиотеки jni reactnativejni
.Причина в том, что Arguments.createArray()
вызывает WritableNativeArray
, который в статическом инициализаторе ReactBridge.staticInit () вызывает SoLoader.loadLibrary("reactnativejni")
.
Так что я подумал, что у меня нет другого выбора, кроме скомпилируйте эту общую библиотеку реагирующая для Linux, используя 64-битную android-ndk-r10e
Мне удалось загрузить эту библиотеку jni и протестировать мой код, используя:
ndkDir=$(pwd)/react-ndk/all/x86 \
JAVA_OPTS="-Djava.library.path=\".:$ndkDir\"" \
LD_LIBRARY_PATH="$ndkDir:$LD_LIBRARY_PATH" ./gradlew app:test
Но проверка завершилась неудачно с:
libreactnativejni.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
Проверена платформа с помощью objdump:
objdump -s --section .comment libreactnativejni.so
libreactnativejni.so: file format elf32-i386
Мой вопрос, как возможно, что 64-битный ndk создал 32-битную библиотеку и как заставить производить 64бит.
Скрипт построения библиотеки написан как скрипт gradle:
https://github.com/facebook/react-native/blob/26684cf3adf4094eb6c405d345a75bf8c7c0bf88/ReactAndroid/build.gradle#L199