我正在尝试将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
。我的文件树看起来像这样:
任何线索为何会发生这种情况?
编辑:
我在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
文件夹中。
这是我的项目目录的样子:
我尝试清理并重建项目,但没有运气
答案 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.so
和absolute/path/to/prebuilt/libqq.so
),它可能会失败,但它不关心 x86 下的文件, armeabi < / strong>, mips64 之间有任何关系。
在Java(例如Android)应用程序中使用预构建的C ++库时,必须保留本机代码命令的Java类名称(包括程序包名称)。
例如,应从net/surina/soundtouch/SoundTouch.java
访问SoundTouch库。
您可以使用任何应用程序包名称;您只保留具有本机方法的Java类。