2014-09-25 64 views
1

在我的项目中,本地库使用反射回调Java代码。所以我也跟着this线程,并添加了以下到的ProGuard-project.txt启用proguard后致命信号11(SIGSEGV)

-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) 
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- 
+0

这可以帮助你。 http://stackoverflow.com/questions/7880107/in-proguard-how-to-preserve-a-set-of-classes-method-names 试试看并发表评论 – CaptainTeemo 2014-09-25 06:11:04

+0

@CaptainTeemo我已经尝试添加所有这些条目在proguard-project.txt中。但是不保存类com.example.abc.NativeClass {*; }单独保留NativeClass的所有方法和字段?我认为问题在于调用opencv方法。因为即使那些没有回调java方法的本地方法,也无法执行。该应用程序也在那里崩溃。顺便说一句,感谢您的帮助。 – 2014-09-25 07:46:16

+0

这个类是不是调用了其他类的“-keep”类?顺便说一句,LogCat会很酷。如果您无法找到可能位于标记DEBUG下的所有消息过滤器中的消息。 – CaptainTeemo 2014-09-25 08:08:15

回答

3

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

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

我没有看到它在OpenCV的源代码,向右走,但如果本机代码试图访问某些类,字段,或者在Java代码中的方法,你应该再保留这些:

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

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

+0

我加了-keep类org.opencv。** {*; }。还是一样的错误。在本机代码中,我实际上调用了一个在NativeClass中定义的java方法,如下所示:jclass thisclass = env-> GetObjectClass(o); jmethodID metExtract = env-> GetMethodID(thisclass,“extractROI”,“(Lorg/opencv/core/Mat;)V”);这有什么不对吗? – 2014-09-26 06:50:15

+1

然后您需要保留该代码中的所有硬编码名称和签名:'extractROI(...)'和'org.opencv.core.Mat'。在这种情况下:'-keepclassmembers class com.example.abc.NativeClass {void extractROI(org.opencv.core。垫); }和'-keep class org.opencv.core.Mat'。作为更大的一组类,字段和方法的一部分,您当前的配置已经保留了这个方法和这个类。您应该检查是否还有其他尚未覆盖的案例。 – 2014-09-27 10:28:55

相关问题