我的 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_INCLUDES
、LOCAL_CFLAGS
等是做什么的。
谢谢。
最佳答案
这可能是个愚蠢的建议,但请确保你在做
ndk-build clean
在调用之间,因为 make 系统可能无法检测传入的编译器标志中的更改来重建文件。
如果真的那么明显,是否有理由不能在构建时动态链接到 ffmpeg 并通过 Java 机制加载它?
关于android - dlopen 用于 android 中的不同风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863378/