2013-11-21 2 views
1

Android 4.0 (API 레벨 15)에는 코덱 목록을 가져올 API가 없습니다. New API은 API 레벨 16 이상 만 지원합니다. 하지만 API 레벨 15를 지원해야합니다. 따라서 JNI를 사용하여 here을 참조하는 원시 코드를 작성해야합니다. 이름이 단지 형식 char *이기 때문에Android NDK에서 코덱 정보의 역할을 어떻게 얻을 수 있습니까?

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); 
    } 
} 

내가 코덱 정보의 이름을 얻을 수 있습니다 :

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 &); 
}; 

코드

코덱 정보의 이름을 얻을 수 있습니다. 그러나 이제는 OMX_ERRORTYPE getRolesOfComponent(const char *name, Vector<String8> *roles) 기능을 사용하여 코덱 정보의 역할을 얻으려고합니다. rolesVector<String8> 유형이고이 두 클래스가 없기 때문에 나는 할 수 없습니다. 더 진지하게, 안드로이드는 libutils.so과 같은 공유 라이브러리에서이 두 클래스의 구현을 제공하지 않는 것 같습니다. 어떻게이 기능을 호출하고 내가 원하는 정보를 얻을 수 있습니까? 도와주세요. 나는 하루 종일 두통이있다! @ 알렉스에

업데이트

덕분에, 마침내 나는 내 문제를 해결했다. 나는 코드 here을 넣었다. 희망이 같은 문제를 만난 사람들을 도울 것입니다.

+0

나는 dlopen()을 통해 비공개 네이티브 API와 함께 작업하는 우리의 접근 방식을 좋아합니다. 그러나 모든 실제적인 목적을 위해 libstagefright.so와 다른 것들에 직접 링크 할 수 있으며,'android :: Vector'와'android :: String8'을위한 시스템 헤더도'# include '할 수 있습니다. –

답변

1

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()는 벡터에 완전히 제대로 초기화 참조를 필요로 보여줍니다 :이 라이브러리에 링크 할 수 있습니다 경우

그래서, 당신은 뭔가를 쓸 수 있습니다 (libutils.so)을 통해 Android 개인 수업에 대한 모든 액세스를 유지하려는 경우 수동으로 dlopen()을 입력하십시오.

+0

그러나''Vector''의 construtor는 인라인이므로''libutils.so''에는 그러한 심볼이 없습니다. – Yuanhang

+0

벡터 생성자는 인라인이지만 VectorImpl 생성자에 의존합니다. –

+0

이 "Vector roles;"을 실행하면 "Vector "이라는 construtor가 자동으로 호출됩니다. ''VectorImpl''을 어떻게 호출 할 수 있습니까? 또한''Vector''는 클래스 템플릿이 아니라 클래스입니다. – Yuanhang