Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 启用proguard后的致命信号11(SIGSEGV)_Android_Opencv_Java Native Interface_Proguard - Fatal编程技术网

Android 启用proguard后的致命信号11(SIGSEGV)

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方法(

在我的项目中,本机库使用反射回调Java代码。因此,我遵循线程并将以下内容添加到proguard-project.txt中

-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
。您当前的配置已经保留了这个方法和这个类,作为一组更大的类、字段和方法的一部分。您应该检查是否还有其他案例尚未涵盖。