Android ndk libreactnativejni.so在64位android ndk(linux)上构建为elf32-i386

Android ndk libreactnativejni.so在64位android ndk(linux)上构建为elf32-i386,android-ndk,react-native-android,Android Ndk,React Native Android,编辑:我成功构建了x86_64版本的libreactnativejni。然而,这并没有解决我的问题 总结一下我在这里学到的是: 您无法测试在Linux上使用本机库的android组件,因为Linux不存在libandroid.so核心android库。 原始问题: 我的目标是使用PowerMockito在我的Linux机器上运行测试,类似于。 不确定react native团队是如何运行此测试的,但根据我的经验,如果不加载jni库react NativeJNI,则不可能模拟Arguments.c

编辑:我成功构建了x86_64版本的libreactnativejni。然而,这并没有解决我的问题

总结一下我在这里学到的是:

您无法测试在Linux上使用本机库的android组件,因为Linux不存在libandroid.so核心android库。 原始问题: 我的目标是使用PowerMockito在我的Linux机器上运行测试,类似于。 不确定react native团队是如何运行此测试的,但根据我的经验,如果不加载jni库react NativeJNI,则不可能模拟Arguments.createArray。原因是Arguments.createArray调用WritableNativeArray,后者在静态初始值设定项中调用SoLoader.loadLibraryreactnativejni

所以我想我没有其他选择,但对于linux,使用64位

我设法加载了这个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位库

库构建脚本编写为渐变脚本:

droid显式32位目标。如果您愿意,您可以替换这一行来阅读

APP_ABI := all

我将回答我自己的问题,感谢Alex的优秀应用程序ABI领导。要编译reactnativejni的x86_64变体,请执行以下步骤:

将APP_ABI更新为APP_ABI:=armeabi-v7a x86_64 x86,位于文件droid/src/main/jni/Application.ml中 下一个问题是依赖关系,它不是为X86_64目标构建的。还有一个替代方案也是为X86_64构建的

直接从aar中提取文件夹X86_64,并将其放入droid/build/third party ndk/jsc/jni/X86_64中 但是,X86_64上的编译将失败,并出现错误:lambda捕获初始值设定项仅适用于-std=c++1y或-std=gnu++1y

通过将所有Android.mk文件中出现的-std=c++1y替换为-std=c++11,修复该错误

现在,您可以开始构建:./gradlew buildReactNdkLib

或者,您可能需要使用./gradlew cleanReactNdkLib清理生成文件夹 build reactnativejni-libreactnativejni.so将出现在reactDroid/build/react ndk/all/x86_64中


但不幸的是,libreactnativejni.so不能在Linux上工作,因为它依赖于libandroid.so,而libandroid.so在Linux上不存在。

非常有用。然而,还有一个障碍。android jsc似乎没有针对X86_64编译。未打包aar仅具有x86 armeabi和armeabi-v7a的共享LIB。我不知道我将如何解决这个问题。好吧,幸运的是,还有一个同样构建X86_64的。现在只解决构建错误。这是值得一读的,也许你会选择保留32位,而FB正在努力解决这个问题。不确定保留32位是选项。如果我理解正确,64位Android arm可以加载32位libs。不过,我想在我的64位PC机上运行测试。我可以在X86_64上加载32位jni库吗?请稍候……如果您希望so在Linux上运行,那么您需要一个不同的起点。Android二进制文件在Linux上不工作,Linux二进制文件在Android上不工作。内核几乎相同,但是C运行时有显著的不同。您可以在emulator或Chromebook上测试代码。我已将所有Android.mk文件中出现的-std=c++1y替换为-std=c++11,最后成功构建了X86_64 reactnativejni.so。现在我要从上面的评论中检验我的理论。谢谢你的帮助。好吧,现在我大概明白你的意思了。经过多次努力,我终于编译了X86_64的jni库,但加载失败,原因是:/libreactnativejni.so:libandroid.so:无法打开共享对象。我想Linux没有libandroid.so。所以我从一开始就注定要失败。这里的最后一个问题是react native如何管理运行测试。