Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.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
Java 无法解析相应的jni函数opencv Android_Java_Android_C++_Opencv_Java Native Interface - Fatal编程技术网

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

Java 无法解析相应的jni函数opencv Android,java,android,c++,opencv,java-native-interface,Java,Android,C++,Opencv,Java Native Interface,这就是我得到错误的地方。我正确加载了opencv库,但我得到了这个错误。如果我进入ximgproc,所有本机方法都会被红色标记为“无法解析相应的jni函数名\函数”。我如何解析 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode =

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

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)
正如我所解释的,不要期望androidstudio神奇地将本机方法声明解析到一个库中,而该库不是在integratedexternalNativeBuild中使用gradle构建的

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

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

@SuppressWarnings("JniMissingFunction")
public class Ximgproc {
或为给定项目或所有项目配置此类皮棉检查:

但这并不能解决您的运行时问题。您可能已经构建了C++代码来生成本机共享库,假设它的名称是“强> LbimxGPROC原生”。所以。如果它正确打包到您的APK中,它将被提取到
/data/app lib/com.example.jt1995.provaemo/
(您可以使用
getContext().getApplicationInfo().nativeLibraryDir
检查此路径)

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

System.load("Ximgproc-native");
如果以上所有假设均正确,则链接器在该库中未找到实现createSuperpixelSLIC_0本机方法的导出函数。它尝试了
Java\u org\u opencv\u ximgproc\u ximgproc\u createSuperpixelSLIC\u 10
Java\u org\u opencv\u ximgproc\u createSuperpixelSLIC\u 10\u JIIF

要检查库导出的方法,可以使用NDK gcc工具链中的nm工具。例如,在我的Mac电脑上,可以在
~/Library/Android/sdk/ndk bundle/toolschains/arm-linux-androideabi-4.9/prebuilded/darwin-x86\u 64/bin/arm-linux-androideabi nm
上找到此可执行文件

运行
…nm-D Ximgproc native.so
,它将与T一起列出库的所有导出函数

我相信你不会在这个列表中找到你的功能。也许,名字有点错。也许,您将CFLAGS设置为-fvisibility=hidden,并且没有显式地将函数声明为
JNIEXPORT
(或
\uu属性)((可见性(“默认”))
)。也许,C++函数没有用<代码>外部“C”<代码>声明,并且它的名称被编译器损坏。
如果您使用静态库(xxx.a)作为组装生成的共享库的中介,您应该知道链接器可以丢弃未使用的外部函数。在这种情况下,使用
LOCAL\u total\u STATIC\u库
而不是
LOCAL\u STATIC\u库
可能会有所帮助。

这就是我从“getContext().getApplicationInfo().nativeLibraryDir”中得到的结果:/data/app/com.example.jt1995.provaemo-1/lib/armather问题,你写了关于“Ximgproc native.so”,在我的文件夹项目中我有“jniLibs”带有libs的文件夹,如“libopencv_ximgproc.a”但我写了“.so”,我的是“.a”@alexcoh最后,你需要一个共享库,它是“.so”。您可以使用静态库(“.a”)来构建共享库,但通常情况下,这些静态库会导致混淆。如果使用
ndk build
构建“libopencv\u ximgproc.a”,只需在Android.mk文件中将$(build\u STATIC\u LIBRARY)更改为$(build\u SHARED\u LIBRARY)。