在 Android 4.0(API 级别 15)中,没有获取编解码器列表的 API。 New API仅支持 API 级别 16 及更高版本。但我必须支持 API 级别 15。所以我必须使用 JNI 编写一些本地代码引用 here .
struct OMXPluginBase {
OMXPluginBase() {}
virtual ~OMXPluginBase() {}
virtual void dummy1() = 0;
virtual void dummy2() = 0;
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,
OMX_U32 index) = 0;
virtual OMX_ERRORTYPE getRolesOfComponent(
const char *name,
Vector<String8> *roles) = 0;
private:
OMXPluginBase(const OMXPluginBase &);
OMXPluginBase &operator=(const OMXPluginBase &);
};
获取编解码器名称信息的代码:
void *handle = dlopen("libstagefrighthw.so", RTLD_NOW);
if (handle == NULL) {
return -1;
}
typedef OMXPluginBase *(*CreateOMXPluginFunc)();
CreateOMXPluginFunc createOMXPlugin =
(CreateOMXPluginFunc)dlsym(handle, "createOMXPlugin");
if (!createOMXPlugin) {
createOMXPlugin = (CreateOMXPluginFunc)dlsym(
handle, "_ZN7android15createOMXPluginEv");
}
OMXPluginBase *plugin = (*createOMXPlugin)();
if (plugin) {
OMX_U32 index = -1;
char name[128];
OMX_ERRORTYPE err;
while ((err = plugin->enumerateComponents(name, sizeof(name),
++index)) == OMX_ErrorNone) {
printf("%s\n", name);
}
if (err != OMX_ErrorNoMore) {
printf("0x%x\n", err);
}
}
我可以获得编解码器信息的名称,因为该名称只是类型 char *
.但是,现在我想使用函数获取编解码器信息的角色
OMX_ERRORTYPE getRolesOfComponent(const char *name, Vector<String8> *roles)
但我不能那样做,因为roles
类型为 Vector<String8>
我没有这两个类。更严重的是,Android 似乎没有在像 libutils.so
这样的共享库中提供这两个类的实现。 .那么我怎样才能调用这个函数并得到我想要的信息呢?请帮我。我为此头痛了一整天!
更新
感谢@Alex,我终于解决了我的问题。我把代码 here .希望这对遇到同样问题的人有所帮助。
最佳答案
android::Vector
和android::String8
都是在libutils.so
中实现的。
所以,如果你可以链接到这个库,你可以这样写:
Vector<String8> roles;
err = plugin->getRolesOfComponent(name, &roles);
if (err == OMX_ErrorNone) {
for (int i=0; i<roles.size(); i++) {
printf(" %s\n", roles.array()[0].string());
}
}
不幸的是,我的实验表明 getRolesOfComponent()
需要一个完全正确初始化的 Vector 引用,因此您需要手动调用构造函数(在 libutils.so
中)如果您希望通过 dlopen()
保留对 Android 私有(private)类的所有访问权限。
关于android - 如何获取Android NDK中编解码信息的角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116390/