2016-01-18 3 views
1

У меня есть родной lib в моем проекте Android, где он открывается .so файлы. У моего приложения Android есть два варианта, и у них разные идентификаторы приложений. В моем .c коде я использую ldopen так:dlopen для разных вкусов в android

handle = dlopen("/data/data/<application.id>/lib/libffmpeg.so", RTLD_LAZY); 

Так это работает только для одного из ароматов в то время.

Я попытался это исправить с #ifdef директивой:

#ifdef STAGE 
    handle = dlopen("/data/data/<application.id.stage>/lib/libffmpeg.so", RTLD_LAZY); 
#else 
    handle = dlopen("/data/data/<application.id>/lib/libffmpeg.so", RTLD_LAZY); 
#endif 

Я пытаюсь определить этап в моей build.gradle файл, но не могу найти способ сделать это. Вот задача, которую я использовать для создания родных ources:

task buildNative(type: Exec, description: 'Compile JNI source via NDK') { 
    Properties properties = new Properties() 
    properties.load(project.rootProject.file('myProject/local.properties').newDataInputStream()) 
    def ndkdir = properties.getProperty('ndk.dir', null) 

    def command = "$ndkdir/ndk-build"; 
    if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
     script += '.cmd' 
    } 

    commandLine "$command", 
      '-C', file('src/main/libs').absolutePath, // Change src/main/jni the relative path to your jni source 
      '-j', Runtime.runtime.availableProcessors(), 
      'all', 
      'NDK_DEBUG=1', 
      'APP_CFLAGS=-DSTAGE' 
} 

tasks.withType(JavaCompile) { 
    compileTask -> compileTask.dependsOn buildNative 
} 

Может кто-то предложить мне, как это сделать?

P.S. вероятно, вопрос действительно глупо, или я пытаюсь сделать это совершенно неправильно. Извините за это, но у меня действительно небольшой опыт работы в c/C++, поэтому я понятия не имею, что все эти LOCAL_C_INCLUDES, LOCAL_CFLAGS и т.д. Спасибо.

ответ

0

Может быть глупым советом, но убедитесь, что вы делаете

ndk-build clean

между запусками, потому что система сделает не может обнаружить изменения в принятых в флагах компилятора для восстановления файлов.

И на самом деле это очевидно, есть ли причина, по которой вы не можете динамически связываться с ffmpeg во время сборки и загружать его через механизм Java?

Смежные вопросы