2014-09-25 117 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

相關問題