2014-09-25 2 views
1

내 프로젝트에서 네이티브 라이브러리는 리플렉션을 사용하여 Java 코드를 다시 호출합니다. 그래서 나는 ProGuard에서-project.txt하려면 다음을 this 스레드을 따라 추가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

+0

@CaptainTeemo 이미 모든 것을 추가하려고했습니다. proguard-project.txt의 항목 하지만하지 않습니다 -keep class com.example.abc.NativeClass {*; } 단독으로 NativeClass의 모든 메소드와 필드를 유지할 수 있습니까? 문제는 opencv 메서드를 호출하는 것이라고 생각합니다. 콜백 Java 메소드가없는 원시 메소드조차도 실행되지 않기 때문에. 응용 프로그램은 단순히 충돌뿐만 아니라. BTW 귀하의 도움에 감사드립니다. –

+0

이 클래스는 "-keep"이 아닌 다른 클래스를 호출합니까? LogCat은 멋진 것입니다. 찾을 수 없으면 메시지가 태그 DEBUG 아래의 모든 메시지 필터에 있습니다. – CaptainTeemo

답변

3

귀하의 구성이 이미 제대로 com.example.abc.MainActivity 또는 com.example.abc.NativeActivity에 필드 나 메소드에 액세스하려고 네이티브 코드를 차지한다.

libfilters.so는 여전히 Java 코드의 다른 클래스, 필드 또는 메소드에 액세스하려고합니다. 관련 클래스, 필드 및 메서드를 보존해야합니다.

내가 바로 OpenCV의 소스 코드에 표시되지 않지만, 네이티브 코드는 자바 코드에서 일부 클래스, 필드 또는 메소드에 액세스하려고하면, 다시 그 보존해야합니다

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

이것이 도움이된다면 엄격하게 요구되는 클래스, 필드 및 메소드로 수정할 수 있습니다.

+0

-keep class org.opencv. ** {*;}를 추가했습니다. }. 여전히 같은 오류. 네이티브 코드에서 NativeClass에 정의 된 Java 메소드를 실제로 호출합니다. jclass thisclass = env-> GetObjectClass (o); jMethodID metExtract = env-> GetMethodID (thisclass, "extractROI", "(Lorg/opencv/core/Mat;) V"); 이것에 문제가 있습니까? –

+1

그런 다음 코드에서 하드 코드 된 모든 이름과 서명을 유지해야합니다 :'extractROI (...)'와'org.opencv.core.Mat'. 이 경우 :'-keepclassmembers class com.example.abc.NativeClass {void extractROI (org.opencv.core.매트); }'와'-keep class org.opencv.core.Mat'를 사용합니다. 현재 구성은 클래스, 필드 및 메소드의 훨씬 더 큰 세트의 일부로 이미이 메소드 및이 클래스를 유지합니다. 아직 다루지 않은 사례가 있는지 확인해야합니다. –

관련 문제