NDK在Android Studio中与外部依赖混淆

时间:2016-09-01 16:06:30

标签: android android-ndk

我一直致力于使用打包在.aar文件中的外部库的应用程序。在gradle文件中,我只需要添加

compile project(':empalink-2.0')

到目前为止它工作正常。现在我想添加libSVM库的一个端口,这样我就可以将jni目录复制到我的app/src/main中,然后从他们的gradle文件中添加一些代码,最终会像这样:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.csic.iiia.ActivityRecognition"
        minSdkVersion 19
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "jnilibsvm" // <-- This is the name of my C++ module!
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets.main {
        jniLibs.srcDir 'src\\main\\libs'
        jni.srcDirs = []
    }

    task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir\\ndk-build.cmd",
                '-C', file('src\\main\\jni').absolutePath, // Change src/main/jni the relative path to your jni source
                '-j', Runtime.runtime.availableProcessors(),
                'all',
                'NDK_DEBUG=1'
    }

    task cleanNative(type: Exec, description: 'Clean JNI object files') {
        def ndkDir = android.ndkDirectory
        commandLine "$ndkDir\\ndk-build.cmd",
                '-C', file('src\\main\\jni').absolutePath, // Change src/main/jni the relative path to your jni source
                'clean'
    }

    clean.dependsOn 'cleanNative'

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.loopj.android:android-async-http:1.4.6'
    compile project(':empalink-2.0')
    compile 'com.google.android.gms:play-services-appindexing:8.1.0'
    compile 'org.apache.commons:commons-math3:3.6.1'
}

添加的部分是defaultConfig.ndkbuild/cleanNative内容。

现在,在尝试执行应用程序时,收到以下错误:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.csic.iiia.ActivityRecognition-1/base.apk"],nativeLibraryDirectories=[/data/app/com.csic.iiia.ActivityRecognition-1/lib/arm64, /data/app/com.csic.iiia.ActivityRecognition-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "libempac.so"

lilbempac.so是.aar文件中的.so文件,该文件正常工作,直到我将libSVM添加到项目中。我想启用NDK编译会以某种方式影响与外部依赖关系:empalink-2.0的链接。

1 个答案:

答案 0 :(得分:2)

这可能是一个迟到的答案,但...... Empatica仅提供了armpabi版本的libempac.so。但是如果添加其他本机库,gradle将计算其他架构,如armeabi-v7a,mips,mips64等。因此,libempac仅适用于这种架构。 所以你需要禁用除armeabi之外的其他架构的编译。您可以通过在app build.gradle文件中添加此文件来执行此操作: android {       [...]     分裂{         abi {             启用真实             重启()             包括'armeabi'             universalApk false         }     } }