无法解析相应的jni函数opencv Android

这是我得到错误。我正确加载opencv库但我得到这个错误。如果我进入ximgproc所有本机方法都红色标记为“无法解析相应的jni函数name_function”。我如何解决?

protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { Uri uri = data.getData(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); //Log.i("prova",uri.toString()); ImageView imageView = (ImageView) findViewById(R.id.imageView); // imageView.setImageBitmap(bitmap); Mat g=new Mat(bitmap.getHeight(),bitmap.getWidth(), CvType.CV_8UC1); Utils.bitmapToMat(bitmap,g,true); SuperpixelSLIC x=Ximgproc.createSuperpixelSLIC(g,Ximgproc.SLIC,100,3); } catch (IOException e) { e.printStackTrace(); } } } 

这是我得到的错误:

 06-07 19:24:01.370 21090-21090/com.example.jt1995.provaemo E/art: No implementation found for long org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(long, int, int, float) (tried Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10 and Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF) 06-07 19:24:01.370 21090-21090/com.example.jt1995.provaemo E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jt1995.provaemo, PID: 21090 java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(long, int, int, float) (tried Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10 and Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF) at org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC_0(Native Method) at org.opencv.ximgproc.Ximgproc.createSuperpixelSLIC(Ximgproc.java:452) at com.example.jt1995.provaemo.MainActivity.onActivityResult(MainActivity.java:108) at android.app.Activity.dispatchActivityResult(Activity.java:6303) at android.app.ActivityThread.deliverResults(ActivityThread.java:3818) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3865) at android.app.ActivityThread.access$1700(ActivityThread.java:159) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5569) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726) 

正如我在其他地方所解释的那样,不要指望Android Studio神奇地将本机方法声明解析为一个不是在集成的externalNativeBuild中使用gradle构建的库。

您可以简单地忽略此错误消息:您的APK仍将安装预构建的库,并且即使Android Studio将其标记为红色,也会在运行时解析本机方法。

您可以为此方法或整个类添加@SuppressWarnings("JniMissingFunction")注释:

 @SuppressWarnings("JniMissingFunction") public class Ximgproc { 

或者为给定项目或所有项目配置这种Lint检查:

首选项/编辑/检查

但这并不能解决您的运行时问题。 您可能已经构建了C ++代码来生成本 机共享库 ,比如它的名称是libXimgproc-native.so 。 如果它正确打包到您的APK中,它将被解压缩到/data/app-lib/com.example.jt1995.provaemo/ (您可以使用getContext().getApplicationInfo().nativeLibraryDir )检查此路径。

您的Java代码应该在尝试调用org.opencv.ximgproc.Ximgproc类的本机方法之前加载此库:

 System.load("Ximgproc-native"); 

如果以上所有假设都正确,则链接器在该库中找不到实现createSuperpixelSLIC_0本机方法的导出函数。 它尝试了Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10Java_org_opencv_ximgproc_Ximgproc_createSuperpixelSLIC_10__JIIF

要检查库导出的方法,可以使用nm工具,它是NDK gcc工具链的一部分。 例如,在我的Mac上,这个可执行文件可以在~/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-nm

运行…nm -D Ximgproc-native.so并使用T列出库的所有导出函数。

我相信你不会在这个列表中找到你的function。 也许,这个名字有点不对劲。 也许,您将CFLAGS设置为-fvisibility = hidden ,并且未将该函数显式声明为JNIEXPORT (或__attribute__ ((visibility ("default"))) )。 也许,C ++函数没有用extern "C"声明,它的名字被编译器破坏了。

如果使用静态库( xxx.a )作为中间体来组装生成的共享库,则应该知道链接器可以丢弃未使用的外部函数。 在这种情况下,使用LOCAL_WHOLE_STATIC_LIBRARIES而不是LOCAL_STATIC_LIBRARIES可能会有所帮助。