DLPone适用于Android中的不同口味

dlopen for different flavors in android

本文关键字:适用于 Android DLPone      更新时间:2023-10-16

我的安卓项目中有一个本机库,它可以打开 .so 文件。我的安卓应用程序有两种风格,它们有不同的应用程序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,但找不到执行此操作的方法。这是我用来构建原生 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
}

有人可以建议我怎么做吗?

附言可能这个问题真的很愚蠢,或者我试图以完全错误的方式做到这一点。很抱歉,但我在 c/c++ 方面的经验很少,所以我不知道所有这些LOCAL_C_INCLUDESLOCAL_CFLAGS等是做什么的。谢谢。

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

ndk-build clean

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

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