如何在Android中使用.so文件

3
我正在尝试将一个C++库添加到我的Android项目中,但是我一直收到错误提示:
Could not get unknown property 'jniLibs' for source set 'main' of type org.gradle.api.internal.tasks.DefaultSourceSet.  

该项目尝试使用SQLite的.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']
    }
}
1个回答

3
  1. 删除 build.gradle 中的配置。该路径是 jniLibs 的默认值,不需要客户自定义配置。

    sourceSets { main { 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类中使用本地方法来调用so方法。

感谢您的回复@xingjiu。但是我遇到了错误:无法列出“/project/src/main/jniLibs/libsqlite3.so”的内容。无法跟随符号链接。 请问您能否提供建议? - Program-Me-Rev
1
一个纯净的重新构建可能会有所帮助,符号链接通常是由一些中间编译文件引起的。 - xingjiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接