2016-11-29 72 views
1

我试图通过本地方法使用cvtcolor代码,但我得到的本地方法未找到错误。java.lang.UnsatisfiedLinkError:未找到本地方法

这是我的cpp +代码:

#include <com_example_alper_asd_AsdClass.h> 

JNIEXPORT jlong JNICALL Java_com_example_alper_asd_AsdClass_convGray 
    (JNIEnv *, jclass, jlong matAddrRgba, jlong matAddrGray) { 
Mat &mRgba= *(Mat*)mAddrRgba; 
Mat &mGray= *(Mat*)mAddrGary; 
long conv; 
jint retval; 
conv = toGray (mRgba ,mGray); 
retval = (jint)conv; 
return retval; 

    } 
long togray (Mat img, Mat &Gray){ 
cvtColor(img, gray, CV_RGBA2GRAY); 
    if (gray.rows == img.rows && gray.cols == img.cols) 
     return 1; 
    return 0; 


} 

主要活动;

package com.example.alper.counting; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.JavaCameraView; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.imgproc.Imgproc; 

public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2{ 
private static String TAG = "MainActivity"; 
JavaCameraView javaCameraView; 
    Mat mRgba ,mGray; 

     static { 

      System.loadLibrary("MyLibs"); 
     } 


    BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) 
      { 
       case BaseLoaderCallback.SUCCESS: 
        javaCameraView.enableView(); 
        break; 
       default: 

      super.onManagerConnected(status); 
      break; 
      } 
     } 
    }; 
    static { 

     System.loadLibrary("MyLibs"); 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view); 
     javaCameraView.setVisibility(View.VISIBLE); 
     javaCameraView.setCvCameraViewListener(this); 
    } 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (javaCameraView != null) 
      javaCameraView.disableView(); 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (OpenCVLoader.initDebug()) { 
      Log.i(TAG, "Opencv loading Success"); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
     else 
      Log.i(TAG, "Opencv is not loading"); 
     OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this ,mLoaderCallback); 
    } 


    @Override 
    public void onCameraViewStarted(int width, int height) { 
     mRgba = new Mat(height, width, CvType.CV_8UC4); 
     mGray = new Mat(height, width, CvType.CV_8UC1); 
    } 

    @Override 
    public void onCameraViewStopped() { 
     mRgba.release(); 

    } 

    @Override 
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { 
     mRgba= inputFrame.rgba(); 
     CoutingClass.convertGray(mRgba.getNativeObjAddr(),mGray.getNativeObjAddr()); 
     return mGray; 

    } 

} 

package com.example.alper.counting; 

/** 
* Created by alper on 27.11.2016. 
*/ 

public class CoutingClass { 
    public native static int convertGray (long mAddrRgba ,long mAddrGray); 
} 

我的错误是:

FATAL EXCEPTION: Thread-644 
    Process: com.example.alper.counting, PID: 20285 
    java.lang.UnsatisfiedLinkError: Native method not found: com.example.alper.counting.CoutingClass.convertGray:(JJ)I 
     at com.example.alper.counting.CoutingClass.convertGray(Native Method) 
     at com.example.alper.counting.MainActivity.onCameraFrame(MainActivity.java:89) 
     at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:387) 
     at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:328) 
     at java.lang.Thread.run(Thread.java:841) 

我试图调用本地方法,但每次,我得到这个错误。请有人帮助我。

+0

看这个[Q&A](http://stackoverflow.com/questions/24566127/jni-java-lang-unsatisfiedlinkerror-本机方法未找到)。第一步写一个[好问题](http://stackoverflow.com/help/how-to-ask)是先做一些研究。如果你搜索过Stackoverflow,你会发现几个可能的答案。 – MikeJRamsey56

回答

0

您必须首先了解创建JNI时的基本内容,第一个问题是,您的java包如何引用所需的本机方法,为此我们使用整个包名加上下划线_和方法名追加最后。这是你的JNI方法与指定的java调用联系起来的第一个条件

在你的情况下,包名是com.example.alper.counting,类名是CoutingClass,本地方法名是convertGray。所以JNI包装必须是:

JNIEXPORT jlong JNICALL Java_com_example_alper_counting_CoutingClass_convertGray 

您必须遵循JNI标准才能创建本地API。 Docs

+0

我解决了这个问题,但现在我得到这个错误A/libc:致命的信号11(SIGSEGV)在0x000000b4(代码= 1),线程9372做yu有任何关于这个错误的想法。 –

0

ZdaR解释得很好,我想推荐你使用javah来生成你的头文件。 2.2有一个不错的NDK support,它可以为你生成这些文件。

我看到的问题是,在你的.cpp你的函数返回long,并在java中声明本地函数返回int。

更改此:

public class CoutingClass { 
    public native static int convertGray (long mAddrRgba ,long mAddrGray); 
} 

这样:

public class CoutingClass { 
    public native static long convertGray (long mAddrRgba ,long mAddrGray); 
} 
+0

我已经使用了javah,我创建了cpp代码thans来javah commed。 –

+0

其实我的AsdClass.java代码就是这样;包com.example.alper.asd; /** *由阿尔珀于28.11.2016创建。 */ public class AsdClass { public native static long convGray(long matAddrRgba,long matAddrGray); }但是同样有错误 –

+0

标题中的声明是否与.cpp中的定义匹配? – emKaroly

相关问题