Android Studio - 针对预构建的本机库的UnsatisfiedLinkError

时间:2017-09-10 20:19:57

标签: android-studio android-ndk

我正在尝试将SoundTouch C ++库实现到我的android项目中。

Gradle构建工作正常。但是,当我从代码中调用一些与SoundTouch相关的方法时,应用程序崩溃了,我收到以下错误:

  

Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.dancam.chords-1/base.apk"],nativeLibraryDirectories=[/data/app/com.dancam.chords-1/lib/arm64, /system/lib64, /vendor/lib64]]] couldn't find "libsoundtouch.so"

显然它在libs arm64文件夹中找不到libsoundtouch.so。我的文件树看起来像这样:

filetree

任何线索为何会发生这种情况?

编辑:

我在SoundTouch.java

中复制了我的main/java/net/surina/soundtouch课程

当我运行它时,我得到了这个:

  

Caused by: java.lang.UnsatisfiedLinkError: No implementation found for long soundtouch.SoundTouch.newInstance() (tried Java_soundtouch_SoundTouch_newInstance and Java_soundtouch_SoundTouch_newInstance__)

好像它只在soundtouch文件夹中。

这是我的项目目录的样子:

filetree2

我尝试清理并重建项目,但没有运气

1 个答案:

答案 0 :(得分:1)

TL; NR:将app/libs文件夹重命名为app/jniLibs

使用预建库时,必须指示Android Studio可以找到它们。默认位置是模块根目录下的jniLibs。

您可以指示Android Studio在其他位置选择库:将以下内容添加到模块(app)的 build.gradle 脚本中的 android {} 块中:< / p>

sourceSets.main.jniLibs.srcDirs = ['libs', 'src/main/jniLibs', '/absolute/path/to/prebuilt']

每个 jniLibs src目录应该包含 lib××××.so 文件的子目录:arm64-v8a armeabi armeabi-v7a mips mips64 x86 x86_64。并非所有ABI子目录都必须存在,并且您可以进一步控制哪些ABI将用于APK,并带有ndk.abiFilters标记。

正如您所看到的,它可以获取多个库,并将所有 lib××××.so 文件打包到您的APK中。如果存在冲突(例如,它同时发现libs/x86/libqq.soabsolute/path/to/prebuilt/libqq.so),它可能会失败,但它不关心 x86 下的文件, armeabi < / strong>, mips64 之间有任何关系。

在Java(例如Android)应用程序中使用预构建的C ++库时,必须保留本机代码命令的Java类名称(包括程序包名称)。

例如,应从net/surina/soundtouch/SoundTouch.java访问SoundTouch库。

您可以使用任何应用程序包名称;您只保留具有本机方法的Java类。