最近项目需要实现移动端IM系统,百度了IM很久发现即时通讯网的MobileIMSDK框架不错,但是他没有实现flutter版本的代码,于是决定使用flutter调用它的Android_MobileIMSDKSDK库。
使用flutter调用jar包,百度发现(别人的文章要么年代久远,要么写得很模糊)只有一个插件flutter_MobileIMSDK_TCP,但是已经不支持dart3了,于是决定模仿他的框架。由于这个是个插件但是项目需求是直接嵌入到flutter项目内部,在模仿的时候踩了很多坑。废话不多说,直接上教程(部分代码来自deepseek)
1. 添加 JAR 包到 Android 项目
将你的 JAR 文件放入 android/app/libs
目录中。如果没有 libs
目录,可以手动创建一个。
2. 配置 build.gradle
打开 android/app/build.gradle
文件,确保在 dependencies
部分添加了对 JAR 文件的依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//或者直接指定jar包围着(自己百度)
*****************
}
3. 创建 Flutter 平台通道
在 android/app/src/main/java/com/example/my_flutter_app/
目录下创建一个新的 Java 类,例如 MyPlugin.java
。这个类将用于处理 Flutter 与原生 Android 代码之间的通信。
package com.example.my_flutter_app;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;
/** MyPlugin */
public class MyPlugin implements FlutterPlugin, MethodCallHandler {
private MethodChannel channel;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "my_flutter_app");
channel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getMessageFromJar")) {
// 调用 JAR 包中的方法
String message = MyJarClass.getMessage();
result.success(message);
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
}
4. 注册插件
在 MainActivity.java
中注册插件:
(位于android/app/src/main/java/xxx/xxx/MainActivity.java
发现使用VsCode生成的flutter项目没有这个文件,建议使用Android Studio创建项目。这步必须实现,否则dart代码搜索不到android包内java代码。本人因为借鉴别人上个插件的写法所以一直缺少这个部分导致一直报错
MissingPluginException(No implementation found for method *** on channel ***)
)
package com.example.my_flutter_app;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
flutterEngine.getPlugins().add(new MyPlugin());
}
}
5. 在 Flutter 中调用平台代码
在 Flutter 中,你可以通过 MethodChannel(官方推荐的方法,百度吧
)
调用刚刚创建的 Java 代码:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter with JAR'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
const platform = MethodChannel('my_flutter_app');
try {
final String result = await platform.invokeMethod('getMessageFromJar');
print(result);
} on PlatformException catch (e) {
print("Failed to get message: '${e.message}'.");
}
},
child: Text('Get Message from JAR'),
),
),
),
);
}
}
7. 运行项目
确保你的 Android 设备或模拟器已经连接,然后运行项目:
flutter clean
flutter pub get
flutter run
8. 最后
只要flutter版本大于3.2 文章没提到的配置文件一律不需要动