【问题标题】:Error while loading Native Library in Android在 Android 中加载本机库时出错
【发布时间】:2015-06-26 20:34:02
【问题描述】:

我正在尝试在 android studio 中加载本机库。我的项目构建并运行,但在尝试加载 .so 文件时抛出错误。

我的项目结构是:

我的 Gradle 文件是:

    import com.android.build.gradle.tasks.PackageApplication

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.nineoldandroids:library:2.4.0'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile 'com.android.support:support-v4:22.1.1'
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.1.0'
/*
    signingConfigs {
        release {
            storeFile file(System.console().readLine("\n\$ Enter keystore path: "))
            storePassword System.console().readLine("\n\$ Enter keystore password: ")
            keyAlias System.console().readLine("\n\$ Enter key alias: ")
            keyPassword System.console().readLine("\n\$ Enter key password: ")
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
*/
    getNdkDirectory()

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 22
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
    buildTypes {
        debug {
            debuggable true
            jniDebuggable true
        }
    }
}



/*
 * JNI Hack for gradle - works alright, copies native libs over into build folder no problem
 * https://gist.github.com/khernyo/4226923
 */

task copyNativeLibs(type: Copy) {
    from(new File('libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}

tasks.withType(JavaCompile) { options.encoding = "UTF-8" }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(PackageApplication) { pkgTask ->
    pkgTask.jniFolders = new HashSet<File>()
    pkgTask.jniFolders.add(new File(projectDir, 'native-libs'))
}

我正在尝试加载以下文件:

static {
    System.loadLibrary("NativeAudio");
}

我收到以下错误:

java.lang.UnsatisfiedLinkError: Couldn't load Plumble from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/mnt/asec/com.morlunk.mumbleclient-1/pkg.apk"],nativeLibraryDirectories=[/mnt/asec/com.morlunk.mumbleclient-1/lib, /vendor/lib, /system/lib, /system/lib/arm]]]: findLibrary returned null

我尝试了许多参考但无法解决问题。使用 Android Studio 和 Gradle 版本:1.2.3

【问题讨论】:

  • 你的库是为英特尔编译的,所以你可能正在使用 ARM 模拟器
  • 你试过用 gradle 导入吗?我的意思是:在你的依赖部分编译文件('libs/xxx.so')
  • 我得到 仅支持 Jar 类型的本地依赖项。无法处理:C:\Users\Administrator\Desktop\Plumble-Legacy-master\libs\x86\libPlumble.so
  • 无法解决问题

标签: android


【解决方案1】:

与带有 ADT 的 Eclipse 不同,带有 Android 插件的 gradle 默认在 src/main/jniLibs 文件夹中查找本机库。

您可以在以下源集中更改该文件夹位置:

android {
    sourceSets.main {
        jniLibs.srcDir 'src/main/libs'
    }
}

【讨论】:

  • 我加了jniLibs.srcDirs = ['libs'] but unable to solve the issue
  • 尝试在您的 gradle 构建文件末尾删除与本机库相关的任务。我还建议为本地库设置一个单独的文件夹。
  • 删除底部以JNI Hack for gradle 开头的所有内容
  • 我删除了..但仍然无法解决。在删除之前,我能够在 apk 中看到我的 .so 文件(将 .apk 替换为 .zip),但删除后看不到。
  • @IIlya Polenov 同样的错误:` ExceptionLjava/lang/UnsatisfiedLinkError;初始化 Lcom/morlunk/mumbleclient/jni/NativeAudio 时抛出; 06-26 18:45:01.797 19575-19575/com.morlunk.mumbleclient D/AndroidRuntime: java.lang.UnsatisfiedLinkError: 无法从加载器 dalvik.system.PathClassLoader [DexPathList [[zip 文件”/mnt/asec 加载 Plumble /com.morlunk.mumbleclient-2/pkg.apk"],nativeLibraryDirectories=[/mnt/asec/com.morlunk.mumbleclient-2/lib, /vendor/lib, /system/lib, /system/lib/arm] ]]: findLibrary 返回 null `
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
相关资源
最近更新 更多