android - 在 Android 中使用 Proguard 时防止 .so 文件被修剪

标签 android android-ndk quickblox unsatisfiedlinkerror

我在 Android 应用程序中使用 Proguard 来减少方法数量 ( see this )。为此,我在 proguard-project.txt 文件中编写了一些行。在执行必要的命令后,所有 jar 都可以正常工作。但是,当我尝试集成 Quickblox 的视频聊天部分时,他们为我们提供了一个我必须集成的 .so。所以我只是按照他们的指导将其保存在 libs\armeabi\libilbc-codec.so 路径中。现在,当我在没有 Proguard 的情况下运行该项目时,该项目运行良好,但是当我使用 Proguard 编译它时,它会出现以下错误:

11-21 18:18:19.171: E/AndroidRuntime(19825): FATAL EXCEPTION: Thread-34829
11-21 18:18:19.171: E/AndroidRuntime(19825): java.lang.ExceptionInInitializerError
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.quickblox.videochat.core.objects.AudioRecorder$AudioRecorderRunnable.run(AudioRecorder.java:196)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.Thread.run(Thread.java:864)
11-21 18:18:19.171: E/AndroidRuntime(19825): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load ilbc-codec: findLibrary returned null
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.Runtime.loadLibrary(Runtime.java:365)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at java.lang.System.loadLibrary(System.java:535)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.googlecode.androidilbc.Codec.<init>(Codec.java:16)
11-21 18:18:19.171: E/AndroidRuntime(19825):    at com.googlecode.androidilbc.Codec.<clinit>(Codec.java:5)
11-21 18:18:19.171: E/AndroidRuntime(19825):    ... 2 more
11-21 18:18:19.281: E/copybit(19825): Error opening frame buffer errno=13 (Permission denied)

我对使用 Proguard 和 NDK 非常菜鸟,所以有人可以指导我如何克服这个问题吗?我通过右键单击项目 -> Android 工具 -> 添加 native 支持.. 并选择我一直在使用的 .so 文件来添加 native 支持。那么任何人都可以建议任何解决方案或我必须写入此 .so 文件才能工作的行吗?

提前致谢。

编辑: 在关注@ph0b的评论后,我尝试了以下步骤:

我已从 this tutorial 之后的应用程序中删除了 BDK 支持并按照他的步骤解压缩了 apk,我在“/lib/armeabi”下得到了“libilbc-codec.so”库。但仍然出现以下错误。那么现在可能出了什么问题?

11-24 12:12:29.045: E/AndroidRuntime(6049): FATAL EXCEPTION: Thread-455
11-24 12:12:29.045: E/AndroidRuntime(6049): Process: com.hypersquare, PID: 6049
11-24 12:12:29.045: E/AndroidRuntime(6049): java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file "/data/app/com.hypersquare-1/base.apk"],nativeLibraryDirectories=[/data/app/com.hypersquare-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libilbc-codec.so"
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.Runtime.loadLibrary(Runtime.java:366)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.System.loadLibrary(System.java:989)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.googlecode.androidilbc.Codec.<init>(Codec.java:16)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.googlecode.androidilbc.Codec.<clinit>(Codec.java:5)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at com.quickblox.videochat.core.objects.AudioRecorder$AudioRecorderRunnable.run(AudioRecorder.java:196)
11-24 12:12:29.045: E/AndroidRuntime(6049):     at java.lang.Thread.run(Thread.java:818)

最佳答案

Proguard 不应删除 .so 文件,我猜您的问题来自其他原因。

当您使用 Eclipse 中的“添加 native 支持”时,Eclipse 会创建一个空的 ndk 库项目(一个包含空源代码和示例 Makefile 的 jni 文件夹)。

因此,当您构建应用程序时,Eclipse 会清空 libs/*/ 文件夹,然后在此处构建并安装新创建的库。

如果您自己不使用 NDK(未使用它编译任何源代码),则应从项目中删除 jni 文件夹及其内容,并将所需的 .so 文件放入打包到您的 apk 中,直接在 libs/(armeabi|x86|...) 文件夹中(顺便说一句,它是 jniLibs 而不是 libs 时使用 Android Studio)。

为了检查哪些 .so 文件被打包到您的应用中,您可以将 APK 作为 zip 文件打开,并在 lib/(armeabi|x86|...) 文件夹下查看.

关于android - 在 Android 中使用 Proguard 时防止 .so 文件被修剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062172/

相关文章:

android - 横向推荐的 Material 设计工具栏高度是多少

使用 OpenGL 处理 Android 相机帧

android - QuickBlox android session 用户信息为空

javascript - ListView 问题 "cannot resolve constructor arrayadapter anonymous"

android - 如何用图像OpenCV填充多边形

android - 在android中使用ffmpeg时出现乱码

ios - 如何使用 QuickBlox SDK iOS 按名称获取用户

Android:如何使用quickblox维护用户在线/离线状态?

android - 处理 PDF 以减小文件大小/和/或复杂性

android - Android OpenCV手势识别