dlopen for android中的不同口味

时间:2016-01-18 20:20:15

标签: android c++ android-gradle

我的android项目中有一个本机库,它打开.so文件。 我的Android应用程序有两种风格,它们有不同的应用程序ID。 在我的.c代码中,我使用ldopen,如下所示:

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文件中定义STAGE,但找不到这样做的方法。 这是我用于构建原生资源的任务:

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_INCLUDESLOCAL_CFLAGS等。 感谢。

1 个答案:

答案 0 :(得分:0)

可能是一个愚蠢的建议,但请确保你正在做

ndk-build clean

调用之间,因为make系统可能无法检测传入编译器标志中的更改以重建文件。

如果真的很明显,有没有理由你不能在构建时动态链接到ffmpeg并通过Java机制加载它?