android - dlopen 用于 android 中的不同风格

标签 android c++ android-gradle-plugin

我的 android 项目中有一个 native 库,它可以在其中打开 .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
}

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

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

最佳答案

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

ndk-build clean

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

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

关于android - dlopen 用于 android 中的不同风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863378/

相关文章:

android - 如何对相机图像应用效果?

android - 0 Dagger 2 : MVVM unable to scope a module

Android:如何知道按钮是否被按下

c++ - 可变模板参数解包

android - 创建包含 javadoc 和源的 Android 库 AAR

android - 如何从 Gradle 项目依赖项中排除重复的 native 库?

android - 以编程方式获取尺寸

c++ - 如何使用另一个版本的库

c++ - 将文件转换为列表 C++ 的最快方法

android - transformClassesWithJarMergingForDebug - 重复条目 android/support/v4