0

我是 android studio 的新手,正在开发一个使用 OpenCV 的现有项目。我需要为 Android 实现 CMU 的 Pocketsphinx,并且按照他们提供的安装步骤,我在项目的 /src 目录中创建了一个 jniLibs 文件夹,并将用于 pocketsphinx 的适当文件放在那里。

这就是问题发生的地方 - 当我这样做时,我突然收到以下错误消息:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.robodoot.dr.facetracktest-2/base.apk"],nativeLibraryDirectories=[/data/app/com.robodoot.dr.facetracktest-2/lib/arm, /data/app/com.robodoot.dr.facetracktest-2/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]] couldn't find "libjniopencv_core.so"

如果我在 /src 目录中没有 jniLibs 文件夹,我不会收到此错误,但当然我会从 pocketSphinx 收到一个错误,说它找不到所需的 .so 文件。

更重要的是,在查看了 OpenCV 的 SDK 之后,我注意到没有“libjniopencv_core.so”这样的文件。它在任何地方都不存在,还有其他 .so 文件,但没有一个具有该名称。即使我将所有 armeabi 和其他目录从 openCV 安装到我的新 jniLibs 文件夹,我仍然会收到此错误消息。

如何告诉 android studio 仅加载 pocketsphinx jniLibs 文件,而忽略在该目录中搜索 openCV .so 文件?

4

2 回答 2

1

您可以通过在 gradle 中添加以下代码来做到这一点

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi-v7a", "x86","armeabi"
        }

        packagingOptions {
            exclude "lib/arm64-v8a/mysofile.so"
        }
    }
}

将 arm64-v8a/mysofile.so 替换为您要排除的任何内容。

于 2016-10-15T16:47:14.073 回答
0

如何告诉 android studio 仅加载 pocketsphinx jniLibs 文件,而忽略在该目录中搜索 openCV .so 文件?

您不应忽视重要文件。opencv 需要 libjniopencv_core.so。

更重要的是,在查看了 OpenCV 的 SDK 之后,我注意到没有“libjniopencv_core.so”这样的文件。

它必须与其他重要的 so 文件一起在 opencv-android-arm.jar 中。

不清楚为什么文件冲突,应该是gradle的一些问题。您需要检查 APK 的内部结构,以便文件实际包含在其中。您很可能会尝试打包不同的架构,例如 armeabi 和 armeabi-v7。您可能需要从同一架构打包 .so 文件。

于 2016-10-15T19:35:40.190 回答