AndroidStudio编译Taglib源码中遇到的一些问题

系统Ubuntu18.04

AndroidStudio版本3.2.1

NDK:android-ndk-r10e,未使用最新的ndk,貌似最新的有些问题

Taglib是最新的taglib-1.11.1

第一次在AndroidStuido中编译第三方库,遇到的主要问题如下:

1.只是从Build菜单执行Make Project或者Rebuild Project,报错信息如下:

Process 'command '/home/gym/bin/android-ndk-r10e/ndk-build'' finished with non-zero exit value 2
并没有详细错误信息,从网上搜索大部分说是NDK版本太新了,需要使用旧的r10e版本,所以就下载了r10e版本;但还是会报这个错误。

2.后来,由于没有生成Release版本的aar文件,在网上看到可以在AndroidStudio右侧的Gradle窗口的工程的Module下的Task/build目录下执行assembleDebug/assembleRelease单独编译debug或release版本,assemble则是编译debug和release版本。

如图:

双击后自动执行编译,这时候报错信息就详细了,会具体到代码行:

jni/taglib/toolkit/tfile.cpp: In member function 'TagLib::PropertyMap TagLib::File::properties() const':
jni/taglib/toolkit/tfile.cpp:115:42: error: 'dynamic_cast' not permitted with -fno-rtti
   if(dynamic_cast<const APE::File* >(this))
                                          ^

具体上面的报错信息,解决办法是:

在taglib的Adnroid.mk中的LOCAL_CPPFLAGS中增加-frtti,则可以编译过了。

其中ndkBuild配置如下,两者都可以成功编译出so和aar文件:

// This build task also valid
/*task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
    println('executing ndkBuild')
    def ndkBuildingDir = android.ndkDirectory
    ndkBuildingDir = "$ndkBuildingDir/ndk-build"
    commandLine ndkBuildingDir, '-j8', '-C', file('src/main').absolutePath
}*/

task ndkBuild(type: Exec) {
    commandLine 'ndk-build', '-C', file('src/main/jni').absolutePath
}

3.生的aar文件没有包含so文件,导致在运行时提示找不到类

在audioinfo的build.gradle文件中增加以下配置信息,必须按照以下方式配置,不能按照注释掉的方法配置。

sourceSets {
    main {
        jni.srcDirs = [] // 屏蔽gradle的jni生成过程
        //jni.srcDirs = ['src/main/jni'] //disable automatic ndk-build
        //jniLibs.srcDirs = ['libs'] // 指定引用so库的目录
        jniLibs.srcDirs = ['src/main/libs']  //指定引用so库的目录
    }
}

这样配置后,就可以正常生成可用的so和aar文件了。

4.Project中jni的目录结构如下图,taglib位于audioinfo module的src/main/jni目录下,jni与java是同级的。

5.还可以在build.gradle中配置自动拷贝aar到app模块

gradle代码如下:

// Copy aar files from "audioinfo/build/outputs/aar" to "app/libs" folder
task copyAAR(type: Copy) {
    from 'build/outputs/aar'
    into '../app/libs'
}
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(copyAAR)
}

点击右侧Gradle窗口的audioinfo/Tasks/other/copyAAR就自动把aar文件拷贝到app目录的libs目录下:

拷贝结果:

在编译阶段的最后,还报过 FileRef::FileTypeResolver没有析构函数的错误,增加以下构造函数和析构函数后编译通过;但现在去掉增加的代码还是可以编译过,这就很奇怪了。

    class TAGLIB_EXPORT FileTypeResolver
    {
      TAGLIB_IGNORE_MISSING_DESTRUCTOR
    public:
        // AMEYUME Add {@
        /*!
         * Creates a null FileTypeResolver.
         */
        //FileTypeResolver();

        /*!
         * Destroys this FileTypeResolver instance.
         */
        //virtual ~FileTypeResolver();
        // AMEYUME @}

猜你喜欢

转载自blog.csdn.net/ameyume/article/details/83572939