在我的android项目中,我使用的是外部jar库,它使用运行时库 libiconv.so 。我的库包含在项目的lib目录中。该库包含在以下目录hirarcy中的所有三种体系结构中。
libs>
armeabi>libiconv.so
armeabi-v7a>libiconv.so
x86>libiconv.so
但是我得到了日志猫记录的异常:
05-23 12:18:58.857 3081-3081/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libiconv.so from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.tariq.buynow-1.apk,libraryPath=/data/app-lib/com.tariq.buynow-1]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:535)
at com.tariq.buynow.CameraActivity.<clinit>(CameraActivity.java:30)
CameraActivity.java:30的位置是:
static { System.loadLibrary("libiconv.so"); }
我也试过
static { System.loadLibrary("iconv"); }
是否有一些与gradle配置有关的事情,因为我是Android Studio新手,或者错误来源是其他什么?
答案 0 :(得分:5)
尝试使用ZBar SDK时遇到同样的问题。您很可能需要编辑build.gradle以确保APK中包含本机库。这就是我解决问题的方法:https://stackoverflow.com/a/16993006/2221876
答案 1 :(得分:0)
System.loadLibrary()
查看设备的lib目录,而不是应用程序。要做你想做的事,你需要将应用程序中的lib复制到手机的文件系统上,然后从那里加载它。我建议将libs放在/ res / raw /中并以这种方式执行:
try {
// Point the input stream to the library in /res/raw
InputStream is = context.getResources().openRawResource(R.raw.libiconv);
// Create a BufferedInputStream from the InputStream
BufferedInputStream bis = new BufferedInputStream(is);
// Set the FileOutputStream to the app's data directory
FileOutputStream fos = context.openFileOutput("libiconv.so", Context.MODE_PRIVATE);
byte data[] = new byte[1024];
int count;
while ((count = bis.read(data, 0, 1024)) != -1) {
fos.write(data, 0, count);
}
fos.close();
bis.close();
is.close();
System.load(context.getFilesDir() + "/libiconv.so");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException ie) {
ie.printStackTrace();
}
这可能无法正常工作,但这应该是一般的要点。
答案 2 :(得分:0)
将以下行添加到build.gradle脚本
中jniLibs.srcDirs = [&#39; libs&#39;] //将* .so复制到包
在项目视图中,您必须看到: Module / libs / ABI NAME / *。so