【问题标题】:How to use .so files in Android如何在 Android 中使用 .so 文件
【发布时间】:2018-09-26 20:14:25
【问题描述】:

我正在尝试将 C++ 库添加到我的 Android 项目中,但我不断收到错误消息:

Could not get unknown property 'jniLibs' for source set 'main' of type org.gradle.api.internal.tasks.DefaultSourceSet.  

该项目尝试使用 SQLite ( amalgamation).so 库。

如何在我的项目中包含 .so 库并成功链接它以便能够调用它的函数?

提前谢谢大家。

我的 build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
    buildToolsVersion '27.0.3'
    externalNativeBuild {
        cmake {
            path 'CMakeLists.txt'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.+'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

【问题讨论】:

    标签: java android c++ c sqlite


    【解决方案1】:
    1. 删除 build.gradle 中的配置。此路径为 jniLibs 的默认值,无需客户配置。

      源集{ 主要的 { jniLibs.srcDirs = ['src/main/jniLibs'] } }

    或者试试这个配置

    sourceSets {
        main {
            jniLibs.srcDir(['src/main/jniLibs'])
        }
    }
    
    1. 将so文件复制到app/src/main/jniLibs
    2. 将 JNI java 接口 jar 添加到您的依赖项中。
    3. System.LoadLibrary(libName) // 例如你把 xxx.so 放到 jniLibs 文件夹中。这里是 System.LoadLibrary("xxx")
    4. 使用JNI java类中的native方法调用so方法。

    【讨论】:

    • 感谢@xingjiu 的回复。有了这个我得到了错误:Could not list contents of '/project/src/main/jniLibs/libsqlite3.so'. Couldn't follow symbolic link. 你能告诉我吗。
    • 纯干净的构建可能会有所帮助,符号链接总是由一些中间编译文件引起的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多