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.so
和 tess.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库()。
我正在尝试将 Tesseract
与 Android 一起使用,一切正常:我编译了源代码并准备好了 .so
文件。每个 .so
文件都位于不同架构的文件夹中,并由 Android Studio 正确插入 APK 文件(如果我打开 .apk
文件,我可以看到 lib/
文件夹其中包含所有目录 + 其中的 .so
个文件)
它们被命名为 lept.so
和 tess.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库()。