【问题标题】:Fatal signal 11 (SIGSEGV) after enabling proguard启用 proguard 后的致命信号 11 (SIGSEGV)
【发布时间】: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


【解决方案1】:

您的配置已经正确考虑了尝试访问 com.example.abc.MainActivity 或 com.example.abc.NativeActivity 中的字段或方法的任何本机代码。

可能 libfilters.so 仍会尝试访问 Java 代码中的一些其他类、字段或方法。您应该尽量保留相关的类、字段和方法。

我没有立即在 OpenCV 源代码中看到它,但如果本机代码尝试访问 Java 代码中的某些类、字段或方法,您应该再次保留这些:

-keep class org.opencv.** { *; }

如果有帮助,您可以将其细化为严格要求的类、字段和方法。

【讨论】:

  • 我添加了 -keep class org.opencv.** { *; }。还是同样的错误。在本机代码中,我实际上调用了 NativeClass 中定义的 java 方法,例如: jclass thisclass= env->GetObjectClass(o); jmethodID metExtract = env->GetMethodID(thisclass,"extractROI","(Lorg/opencv/core/Mat;)V");这有什么问题吗?
  • 然后您需要保留该代码中的所有硬编码名称和签名:extractROI(...)org.opencv.core.Mat。在这种情况下:-keepclassmembers class com.example.abc.NativeClass { void extractROI(org.opencv.core.Mat); }-keep class org.opencv.core.Mat。但是,您当前的配置已经保留了这个方法和这个类,作为更大的类、字段和方法集的一部分。您应该检查是否还有其他未涵盖的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多