【问题标题】:Cannot resolve corresponding jni function opencv Android无法解析对应的jni函数opencv Android
【发布时间】:2017-11-09 04:37:47
【问题描述】:

这是我得到错误的地方。我正确加载了 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)

【问题讨论】:

    标签: java android c++ opencv java-native-interface


    【解决方案1】:

    正如我在elsewhere 中解释的那样,不要指望 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列出你库的所有导出函数。

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

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

    【讨论】:

    • 这就是我用“getContext().getApplicationInfo().nativeLibraryDir”得到的:/data/app/com.example.jt1995.provaemo-1/lib/arm
    • 另一个问题,你写了关于“Ximgproc-native.so”的文章,在我的文件夹项目中我有“jniLibs”文件夹,其中包含“libopencv_ximgproc.a”之类的库,但我写了“.so”,我的是“.a”@AlexCohn
    • 最后,您需要一个共享库,即“.so”。您可以使用静态库(“.a”)来构建共享库,但这些静态库往往会引起混淆。如果您使用ndk-build 构建“libopencv_ximgproc.a”,您只需在 Android.mk 文件中将 $(BUILD_STATIC_LIBRARY) 更改为 $(BUILD_SHARED_LIBRARY)。
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2018-07-05
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多