Android 找不到库,即使它在 lib 文件夹中

Android doesn't find library even if it's inside lib folder

我正在尝试将 Tesseract 与 Android 一起使用,一切正常:我编译了源代码并准备好了 .so 文件。每个 .so 文件都位于不同架构的文件夹中,并由 Android Studio 正确插入 APK 文件(如果我打开 .apk 文件,我可以看到 lib/ 文件夹其中包含所有目录 + 其中的 .so 个文件)

它们被命名为 lept.sotess.so 并且在它使用的代码中

System.loadLibrary("lept");
System.loadLibrary("tess");

但是当我启动应用程序时我得到这个异常

1-02 16:01:20.824  16384-16384/x.x.x.ocrapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: x.x.x.ocrapp, PID: 16384
java.lang.UnsatisfiedLinkError: Couldn't load lept from loader dalvik.system.PathClassLoader[dexPath=/data/app/x.x.x.ocrapp-2.apk,libraryPath=/data/app-lib/x.x.x.ocrapp-2]: findLibrary returned null
        at java.lang.Runtime.loadLibrary(Runtime.java:358)
        at java.lang.System.loadLibrary(System.java:526)
        at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:44)
        at x.x.x.ocrapp.MainActivity.onCreate(MainActivity.java:18)
        at android.app.Activity.performCreate(Activity.java:5426)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
        at android.app.ActivityThread.access0(ActivityThread.java:161)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)

表示无法加载 lept 库。

它似乎在 libraryPath=/data/app-lib/x.x.x.ocrapp-2 app-lib 文件夹中搜索库,而我的在 lib 文件夹中。

无论是在模拟器上还是在真实设备上都不起作用。 (三星 Galaxy S4)

如何修复此异常并让 Android 加载本机库?

They are named lept.so and tess.so 

这些不是标准名称,因为它们缺少 lib 前缀。

System.loadLibrary("lept");
System.loadLibrary("tess");

这会导致搜索 liblept.so 而不是您拥有的文件。

要么给你的库一个标准名称,要么指定一个实际的文件名包括它最终安装在设备上的路径到System.load()而不是System.load库()。