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