简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.Java回调函数介绍
- 🌻3.代码实例
- 🐓3.1 实现步骤
- 🐓3.2 创建回调接口和实现的项目
- 🐓3.3 创建回调函数interface接口
- 🐓3.4 实现回调函数
- 🐓3.5 使用interface接口实现
- 🐓3.6 实现CallbackResult类
- 🐓3.7 将Callback.java和CallbackImpl.java生成jar包
- 🐓3.8 底层回调jar包里的接口,给他返回数据
- 🐓3.9 使用jar包com.example.jar和MainApp.java联合编译
- 🐓3.10 运行
- 🐓3.11 整体命令
🌻1.前言
本篇目的:Java基础之应用向jar包sdk注册回调函数实例
- 需求:将Callback 接口和它的实现封装在一个 JAR包sdk中,供应用程序使用,步骤如下。
🌻2.Java回调函数介绍
- 回调函数(Callback Function)是一种在编程中常用的技巧,用于实现事件驱动或异步编程。在 Java 中,回调函数通常用于实现某些方法的延迟执行、事件处理或跨模块的代码调用。虽然 Java 本身没有直接支持回调函数的语法,但可以通过多种方式实现回调机制。
- 回调函数的定义很简单:当你需要在某个时间点执行一个方法时,你可以将这个方法作为参数传递给另一个方法,当需要执行时,这个方法会被调用。这个被传递的方法就称为回调函数。
- 在 Java 中,可以通过接口(Interface)和匿名内部类(Anonymous Inner Class)来实现回调函数。下面分别介绍这两种方式。
- 通过接口实现回调函数
接口是 Java 中实现回调函数最常见的方式。你可以定义一个接口,然后在需要的地方实现这个接口,并将实现类作为参数传递给其他方法。
接口中只定义一个方法,该方法需要被实现类重写。这样,接口就成为了一个回调函数的模板。当其他方法需要一个回调函数时,它只需要一个实现了该接口的参数即可。 - 通过匿名内部类实现回调函数
匿名内部类是 Java 中实现回调函数的另一种方式。匿名内部类允许你在创建对象时就立即调用这个对象的方法。
匿名内部类通常用于实现接口或继承类。在这种情况下,你可以直接在代码中定义一个匿名内部类,并重写需要的方法。然后,你可以将这个匿名内部类作为参数传递给其他方法。
使用匿名内部类实现回调函数的优点是代码简洁,无需创建单独的类来实现接口。这使得匿名内部类在需要回调函数的场景中非常方便。
- Java 中的回调函数主要用于实现事件驱动或异步编程。通过接口和匿名内部类两种方式,可以灵活地实现回调机制。接口方式使得代码更加清晰,易于理解和维护;而匿名内部类方式则使得代码更加简洁,适用于简单的回调场景。掌握回调函数的使用,可以帮助你更好地应对 Java 编程中的各种挑战。
🌻3.代码实例
🐓3.1 实现步骤
1.创建一个独立的 Java 项目来定义和实现 Callback 接口。
2.将这个项目打包成 JAR 文件。
3.在应用程序中使用这个 JAR 文件。
🐓3.2 创建回调接口和实现的项目
基本代码架构
com.example.jar/
├── src/
│ └── com/
│ └── example/
│ ├── Callback.java
│ ├── CallbackImpl.java
│ ├── CallbackManager.java
│ └── CallbackResult.java
├── build/
└── com.example.jar
🐓3.3 创建回调函数interface接口
# mkdir -p src/com/example
# emacs Callback.java
package com.example;
public interface Callback {
void onCallback(CallbackResult result);
}
🐓3.4 实现回调函数
# emacs CallbackImpl.java
package com.example;
public class CallbackImpl implements Callback {
@Override
public void onCallback(CallbackResult result) {
// 接收回调并处理
System.out.println("mkey = " + result.mkey + ", value = " + result.mval);
}
}
🐓3.5 使用interface接口实现
# emacs CallbackManager.java
package com.example;
public class CallbackManager {
private static Callback mcallback;
// 注册回调方法
public static void registerCallback(Callback cb) {
mcallback = cb;
}
// 注销回调方法
public static void unregisterCallback() {
mcallback = null;
}
public static void send(CallbackResult result) {
if (mcallback != null) {
mcallback.onCallback(result);
} else {
System.out.println("没有回调接口注册");
}
}
}
- 注意:相当于底层的CarAudioFocus.java拿到应用传来的mcallback后,给他在回调函数中传结构体值就行了。
🐓3.6 实现CallbackResult类
# emacs CallbackResult.java
package com.example;
public class CallbackResult {
public String mkey;
public int mval;
public CallbackResult(String key, int val) {
this.mkey = key;
this.mval = val;
}
}
🐓3.7 将Callback.java和CallbackImpl.java生成jar包
- <1>.使用javac命令将Java源代码编译成字节码(.class文件)
# javac -d bin src/com/example/*.java
-
在bin目录下生成Callback.class和CallbackImpl.class文件。
-
<2>.使用jar命令将.class文件生成jar包
# jar cf com.example.jar -C bin .
- 将bin目录下的Callback.class和CallbackImpl.class文件生成com.example.jar包。
🐓3.8 底层回调jar包里的接口,给他返回数据
# cd src/
# emacs MainApp.java
import com.example.Callback;
import com.example.CallbackImpl;
import com.example.CallbackManager;
import com.example.CallbackResult;
public class MainApp {
public static void main(String[] args) {
// 创建回调接口的实现类实例
Callback callbackImpl = new CallbackImpl();
// 注册回调
CallbackManager.registerCallback(callbackImpl);
// 创建一个包含 key 和 val 的结构体实例
CallbackResult result = new CallbackResult("testKey", 55);
// 发送回调
CallbackManager.send(result);
// 注销回调
CallbackManager.unregisterCallback();
}
}
🐓3.9 使用jar包com.example.jar和MainApp.java联合编译
# javac -cp com.example.jar src/MainApp.java -d build
- 将MainApp.java生成的MainApp.class,编译到 build目录下。
🐓3.10 运行
# java -cp build:com.example.jar MainApp
得到回调结果:55
🐓3.11 整体命令
1.使用javac命令将Java源代码编译成字节码(.class文件)
# javac -d bin src/com/example/*.java
2.使用jar命令将.class文件生成jar包
# jar cf com.example.jar -C bin .
3.编译MainApp.java
# javac -cp com.example.jar src/MainApp.java -d build
4.运行
# java -cp build:com.example.jar MainApp
得到回调结果:55
没有回调接口注册