我的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_INCLUDES
,LOCAL_CFLAGS
等。
感谢。
答案 0 :(得分:0)
可能是一个愚蠢的建议,但请确保你正在做
ndk-build clean
调用之间,因为make系统可能无法检测传入编译器标志中的更改以重建文件。
如果真的很明显,有没有理由你不能在构建时动态链接到ffmpeg并通过Java机制加载它?