Как я могу получить роли информации о кодеках в Android NDK?

В Android 4.0 (уровень API 15) нет API для получения списка кодеков. Новый API только поддержка API уровня 16 и выше. Но я должен поддерживать уровень API 15. Поэтому я должен использовать JNI для написания некоторого нативного кода, ссылающегося на Вот.

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, наконец, я решил свою проблему. Я поставил код Вот. Надеюсь, что это поможет тем, кто столкнулся с той же проблемой.

1

Решение

И то и другое 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) вручную, если вы хотите сохранить доступ к закрытым классам Android через dlopen(),

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]