Android 启用proguard后的致命信号11(SIGSEGV)
在我的项目中,本机库使用反射回调Java代码。因此,我遵循线程并将以下内容添加到proguard-project.txt中Android 启用proguard后的致命信号11(SIGSEGV),android,opencv,java-native-interface,proguard,Android,Opencv,Java Native Interface,Proguard,在我的项目中,本机库使用反射回调Java代码。因此,我遵循线程并将以下内容添加到proguard-project.txt中 -keep class com.example.abc.MainActivity { *; } -keep class com.example.abc.NativeClass { *; } 保留NativeClass(声明所有本机方法的地方)和Mainactivity(调用本机方法的地方)中的所有方法和字段。在这些本机方法中,再次调用NativeClass.java方法(
-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)
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
您的配置已经正确地解释了试图访问com.example.abc.MainActivity或com.example.abc.NativeActivity中的字段或方法的任何本机代码 很可能libfilters.so仍然试图访问Java代码中的其他一些类、字段或方法。您应该尝试保留相关的类、字段和方法 我没有立即在OpenCV源代码中看到它,但是如果本机代码试图访问Java代码中的某些类、字段或方法,您应该再次保留它们:
-keep class org.opencv.** { *; }
如果这有帮助,您可以将其细化为严格要求的类、字段和方法。这可以帮助您。试试看并评论一下us@CaptainTeemo我已经尝试在proguard-project.txt中添加所有这些条目。但是-keep类com.example.abc.NativeClass{*;}是否单独保留NativeClass的所有方法和字段?我认为问题在于调用opencv方法。因为即使是那些不回调java方法的本机方法也无法执行。应用程序也会在那里崩溃。顺便说一句,谢谢你的帮助。这门课会叫其他没有“保持”教育的课吗?顺便说一句,LogCat会很酷的。如果您找不到消息,则消息可能位于“调试”标记下的“所有消息”筛选器中。@CaptainTeemo我已用一些日志更新了问题。你能从那些日志中判断出错误的原因吗?我看不到这个日志的任何内容。我有点不懂人的意思。你能试着把我告诉你的日志放进去吗?1.连接设备以查看LogCat。2.转到“所有消息”筛选器。3.用绿色字母表示,使用标记DEBUG,将有一个巨大的转储,它还引用您的本机代码函数。(我也讨厌在Android中调试本机代码)我添加了-keep class org.opencv.*{*;}。还是一样的错误。在本机代码中,我实际上调用了在NativeClass中定义的java方法,如:jclass thisclass=env->GetObjectClass(o);jmethodID metExtract=env->GetMethodID(这个类,“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
。您当前的配置已经保留了这个方法和这个类,作为一组更大的类、字段和方法的一部分。您应该检查是否还有其他案例尚未涵盖。