Android中的so文件

so文件是什么

so文件,即Shared Object,是用C/C++(JNI)编译出来的Android平台上的动态链接库,类比.dll。本质上就是一段用C/C++写的、编译成机器码的本地代码库。

Android Java 层无法直接调用C/C++,必须通过JNI

为什么Android要用so文件

Android App 平时写的是Java或Kotlin代码,但有些场景下:

  • 对性能要求特别高(如图像处理、音视频解码、AI 推理等)
  • 需要复用已有的C/C++代码(如 OpenCV、FFmpeg、TensorFlow Lite)
  • 需要调用底层系统接口(JNI 层)

这时就会用到Native层代码(C/C++),然后编译生成so文件,供Java层调用。

so文件存放路径

so文件必须放在特定路径,AGP(Android Gradle Plugin)才能识别到:

1
2
3
4
5
6
7
8
9
app/src/main/jniLibs/

├── armeabi/libopencv.so

├── armeabi-v7a/libopencv.so

├── arm64-v8a/libopencv.so

└── x86/libopencv.so

Android设备有多种ABI(CPU架构),so文件也须根据不同架构单独编译,每个CPU架构文件夹下都放对应的so文件。

可以在app模块的build.gradle中指定:

1
2
3
4
5
6
7
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
}

调用so方法

定义JNI方法

1
2
3
4
5
6
7
8
9
public class NativeHelper {
static {
// 加载libopencv.so,去掉lib前缀
System.loadLibrary("opencv");
}

// native方法,由C/C++实现
public static native String getMessage();
}

通常由提供so文件的一方提供封装了Java native方法的jar/aar

调用

1
String msg = NativeHelper.getMessage();