android - 启用混淆器后出现致命信号 11 (SIGSEGV)

标签 android opencv java-native-interface proguard

在我的项目中, native 库使用反射来回调 Java 代码。所以我关注了this线程并将以下内容添加到 proguard-project.txt

-keep class com.example.abc.MainActivity { *; }
-keep class com.example.abc.NativeClass { *; }

保留 NativeClass(声明所有 native 方法的地方)和调用 native 方法的 Mainactivity 中的所有方法和字段。在这些 native 方法中,再次调用 NativeClass.java 方法(纯 java 方法),该方法又调用 Mainactivity.java 中定义的 java 方法。该应用程序在没有 proguard 的情况下运行良好。但是,在通过启用 proguard 导出项目后,应用程序会在进行 native 方法调用(进而调用 NativeClass 中的 java 方法)时崩溃。我已尝试在 proguard-project.txt 中输入所有可能的命令,但无济于事。 OpenCV 方法在 native 代码中调用。启用 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)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

最佳答案

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

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

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

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

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

关于android - 启用混淆器后出现致命信号 11 (SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031482/

相关文章:

c++ - 如何看懂opencv中warpAffine的源码

java - 特征/ Blob 相关性和直方图分析

java - JNI 中的 GlobalReferences 是否会阻止 GC 清理对象?

java - 如何将 C 变量 (JNI) 存储到 Java 类实例

android - ViewModel 中的 ObservableField 值不会使用数据绑定(bind)更新 UI

android - 增加 Android 设备上的 NFC 功率

android - 构建失败,异常 react native

java - Opencv Java 灰度

android - 根据屏幕尺寸调整图像大小?

android - 我的 Android JNI JPEG 编码器真的很慢