Build .so libraries for each ABI you want to support
You must compile your native library separately for:
armeabi-v7a (32-bit ARM)
arm64-v8a (64-bit ARM)
x86 (32-bit Intel)
x86_64 (64-bit Intel)
Because the emulator is x86-based, you need to build an x86 (or x86_64) version of your native library.
2. Use Android NDK to cross-compile for x86
Example using standalone toolchain or clang wrapper:
export NDK=/path/to/android-ndk
export API=21
export TARGET=i686-linux-android
export PATH=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
export CC="${TARGET}${API}-clang"
export CXX="${TARGET}${API}-clang++"
# Then configure and build your native library with --host=i686-linux-android or equivalent
./configure --host=i686-linux-android --prefix=your_install_dir
make clean
make -j4
make install
This will generate libnfc.so for x86.
3. Include all your .so files in your APK under jniLibs/
Place the .so files under:
app/src/main/jniLibs/armeabi-v7a/libnfc.so
app/src/main/jniLibs/arm64-v8a/libnfc.so
app/src/main/jniLibs/x86/libnfc.so
app/src/main/jniLibs/x86_64/libnfc.so
This way, your app will load the correct native library based on the device or emulator ABI.
4. Alternatively, run an ARM emulator
If building x86 .so is complex, you can create an ARM emulator image (slow but straightforward) in Android Studio and run your ARM .so there.