android - 如何获取Android NDK中编解码信息的角色?

标签 android c++ android-ndk java-native-interface codec

在 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::Vectorandroid::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/

相关文章:

c++ - 如何使用 native 代码中的 JNI 在 Android 上获取音频音量?

android - Visual Studio 2015 Android NDK ARM 架构

android - 当 Droid/Nexus One 上的屏幕关闭时,加速度计停止提供样本,即使使用 WakeLock

c++ - boost::signals2 的绑定(bind)类成员函数

c++ - "struct hack"可以这样实现吗?

c++ - 为什么这个单词排序程序只循环一次?

Android native 窗口时间戳

android - 如何使用户能够直接从他们的浏览器将图像保存到我的 android gallery 应用程序

android - 检查是否有使用操作字符串注册的 BroadCastReceiver

java - 读取重文本文件