Flutter通过MethodChannel调用Java+C++共享库找不到.so文件配置求助
解决方案
1 修正编译侧基础问题
你当前编译的是MacOS平台的.so文件,架构完全不兼容Android系统,首先需要使用Android NDK工具链编译适配Android不同ABI架构的.so文件。
另外你提供的CMakeLists.txt存在拼写错误:set(CMALE_CXX_STANDARD_REQUIRED ON) 需修改为 set(CMAKE_CXX_STANDARD_REQUIRED ON)。
2 Android项目文件放置规则
- 编译好的适配Android的.so文件,按ABI分类放到
android/app/src/main/jniLibs/目录下,目录结构示例:
android/ └── app/ └── src/ └── main/ └── jniLibs/ ├── arm64-v8a/ │ └── libjava_cpp.so ├── armeabi-v7a/ │ └── libjava_cpp.so └── x86_64/ └── libjava_cpp.so
- 你编译生成的
.jar包放到android/app/libs/目录下
3 修改Android侧配置
3.1 调整app模块的build.gradle配置
打开 android/app/build.gradle,做如下修改:
android { defaultConfig { // 新增ndk配置,指定你要支持的ABI架构,和jniLibs下的目录对应 ndk { abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64' } } // 确保libs目录下的jar包会被引入 dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) // 其余原有依赖保留 } }
3.2 修改Java层的库加载代码
删除原来的绝对路径加载逻辑,改为调用System.loadLibrary加载:
static { // 参数是so文件去掉前缀lib、去掉后缀.so的名称,你生成的so是libjava_cpp.so,所以填java_cpp System.loadLibrary("java_cpp"); }
4 MethodChannel调用链路配置
4.1 Android侧注册MethodChannel
在你的Flutter项目的主Activity中注册MethodChannel,接收Dart侧的调用,转发到你jar包中的Java逻辑即可:
// 示例代码,放在MainActivity的onCreate方法中 new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), "你的自定义channel名称") .setMethodCallHandler((call, result) -> { if (call.method.equals("你要调用的方法名")) { // 调用你jar包中的Java方法,Java方法内部会调用C++的逻辑 String res = 你的Java类.方法名(call.argument("参数名")); result.success(res); } else { result.notImplemented(); } });
4.2 Dart侧调用示例
const channel = MethodChannel('你的自定义channel名称'); // 调用方法 final result = await channel.invokeMethod('你要调用的方法名', {'参数名': '参数值'});
可选简化方案
你可以直接把C++源码放到 android/app/src/main/cpp/ 目录下,把你的CMakeLists.txt也放到该目录,然后在android/app/build.gradle中配置CMake编译逻辑,由Android编译流程自动生成对应ABI的so文件,无需手动提前编译:
android { externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.22.1" // 对应你的CMake版本 } } }
内容的提问来源于stack exchange,提问作者Ludwig12
相关产品推荐
相关产品推荐

