【发布时间】:2014-09-25 05:49:11
【问题描述】:
在我的项目中,本机库使用反射来回调 Java 代码。所以我关注this线程并将以下内容添加到proguard-project.txt
-keep class com.example.abc.MainActivity { *; }
-keep class com.example.abc.NativeClass { *; }
保留 NativeClass(声明所有本地方法)和调用本地方法的 Mainactivity 中的所有方法和字段。在这些本地方法中,再次调用 NativeClass.java 方法(纯 java 方法),后者又调用 Mainactivity.java 中定义的 java 方法。该应用程序在没有 proguard 的情况下运行良好。但是在通过启用 proguard 导出项目后,应用程序在进行本地方法调用(进而调用 NativeClass 中的 java 方法)的地方崩溃。我已经尝试了所有可能的命令来输入 proguard-project.txt 无济于事。 OpenCV 方法在本机代码中调用。启用 proguard 时我应该如何处理 OpenCV 本机代码。请帮忙。
以下是墓碑文件中的日志
/data/data/com.example.imageanalyse/lib/libfilters.so
be98d7a0 0000f2b8 [heap]
be98d7a4 be98d7b4 [stack]
be98d7a8 56d47798 /dev/ashmem/dalvik-LinearAlloc (deleted)
be98d7ac 5bdb9d6b /data/data/com.example.imageanalyse/lib/libfilters.so
be98d7b0 00000000
be98d7b4 00000000
--------- tail end of log /dev/log/main
09-25 15:20:56.930 3356 3357 D dalvikvm: GC_CONCURRENT freed 18K, 48% free 20256K/38855K,
paused 2ms+8ms
09-25 15:20:56.980 3356 3356 D dalvikvm: GC_FOR_ALLOC freed 5120K, 58% free 16405K/38855K,
paused 22ms
09-25 15:20:57.030 3356 3356 D dalvikvm: GC_FOR_ALLOC freed 1278K, 58% free 16449K/38855K,
paused 22ms
09-25 15:20:57.070 3356 3356 D dalvikvm: GC_FOR_ALLOC freed 1269K, 58% free 16449K/38855K,
paused 22ms
09-25 15:20:57.090 3356 3356 F libc : Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
【问题讨论】:
-
这可以帮助你。 stackoverflow.com/questions/7880107/…尝试并评论我们
-
@CaptainTeemo 我已经尝试在 proguard-project.txt 中添加所有这些条目。但是 -keep class com.example.abc.NativeClass { *; } 单独保留 NativeClass 的所有方法和字段?我认为问题在于调用 opencv 方法。因为即使是那些不回调java方法的native方法,也无法执行。该应用程序也会在那里崩溃。顺便说一句,感谢您的帮助。
-
这些类是否在调用其他非“-keep”类?顺便说一句,LogCat 会很酷。如果您找不到消息,则可能位于标签 DEBUG 下的所有消息过滤器中。
-
@CaptainTeemo 我已经用一些日志更新了这个问题。能否请您从这些日志中判断错误原因?
-
我看不到此日志的任何内容。我有点人类难以理解。你能试着把我告诉你的日志放上去吗? 1. 连接您的设备以查看 LogCat。 2. 转到“所有消息”过滤器。 3. 在绿色字母中,带有 DEBUG 标签,将有一个巨大的转储,其中还引用了您的本机代码函数。 (我也讨厌在 Android 中调试原生代码)
标签: android opencv java-native-interface proguard