Android MediaCodec 如何创建解码器?
How does Android MediaCodec create a decoder?
我注意到 java/android/media
有一个名为 createDecoderByType()
的方法,它应该 return 一个 MediaCodec
对象。但是,当我查看 MediaCodec.java
source code on GoogleGit 时,我真的看不出实际的解码器是如何生成的。这是该方法的代码:
public static MediaCodec createDecoderByType(String type) {
return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
然后当我查看构造函数以查看 returned 时,这就是我所看到的:
private MediaCodec(
String name, boolean nameIsType, boolean encoder) {
native_setup(name, nameIsType, encoder);
}
好的,很好。让我们看看native_setup()
。定义如下:
private native final void native_setup(
String name, boolean nameIsType, boolean encoder);
那个函数似乎没有主体!
起初我假设这意味着该方法将在子 class 中定义。但是我看到在其他功能源代码中直接在 MediaCodec
本身上调用了这个方法。
所以我的问题是:有什么方法可以追踪并查看 Android 如何根据环境和参数创建给定类型的解码器?我似乎走到了死胡同,谷歌搜索再多也没有给我任何有用的结果。
我发布后一分钟就找到了答案...当然。问题出在 native
关键字上。来自 GeeksforGeeks:
The native keyword is applied to a method to indicates that the method is implemented in native code using JNI (Java Native Interface).
这意味着它可以用另一种语言编写,例如 C 或 C++,或者调用硬件的东西。我正在寻找的 MediaCodec
JNI 代码是 here。
我注意到 java/android/media
有一个名为 createDecoderByType()
的方法,它应该 return 一个 MediaCodec
对象。但是,当我查看 MediaCodec.java
source code on GoogleGit 时,我真的看不出实际的解码器是如何生成的。这是该方法的代码:
public static MediaCodec createDecoderByType(String type) {
return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
}
然后当我查看构造函数以查看 returned 时,这就是我所看到的:
private MediaCodec(
String name, boolean nameIsType, boolean encoder) {
native_setup(name, nameIsType, encoder);
}
好的,很好。让我们看看native_setup()
。定义如下:
private native final void native_setup(
String name, boolean nameIsType, boolean encoder);
那个函数似乎没有主体!
起初我假设这意味着该方法将在子 class 中定义。但是我看到在其他功能源代码中直接在 MediaCodec
本身上调用了这个方法。
所以我的问题是:有什么方法可以追踪并查看 Android 如何根据环境和参数创建给定类型的解码器?我似乎走到了死胡同,谷歌搜索再多也没有给我任何有用的结果。
我发布后一分钟就找到了答案...当然。问题出在 native
关键字上。来自 GeeksforGeeks:
The native keyword is applied to a method to indicates that the method is implemented in native code using JNI (Java Native Interface).
这意味着它可以用另一种语言编写,例如 C 或 C++,或者调用硬件的东西。我正在寻找的 MediaCodec
JNI 代码是 here。