在Android中使用Proguard时,请保留.so文件不被修剪

时间:2014-11-21 13:08:31

标签: android android-ndk quickblox unsatisfiedlinkerror

我在我的Android应用程序中使用Proguard来减少方法的数量(see this)。为此,我在 proguard-project.txt 文件中编写了一些代码。在必要的命令之后,所有罐子都能很好地工作。但是当我尝试集成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,所以任何人都可以指导我如何克服这个问题?我通过右键单击项目添加了原生支持 - &gt; Android工具 - &gt;添加本机支持..并选择我一直使用的.so文件。那么,任何人都可以建议任何解决方案或我必须写入此.so文件的行吗?

先谢谢。

修改: 在关注@ ph0b的评论之后,我尝试了以下步骤:

我已经从this tutorial之后的应用程序中删除了BDK supprot,并且按照他的步骤解压缩了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)

1 个答案:

答案 0 :(得分:2)

Proguard不应该删除.so文件,我想你的问题来自其他地方。

当您使用&#34;添加原生支持&#34;从eclipse开始,eclipse创建了一个空的ndk库项目(一个带有空源和一个示例Makefile的jni文件夹)。

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

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

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