Android NDK OpenCV-未找到本机的实现

Android NDK OpenCV-未找到本机的实现,android,c++,opencv,android-ndk,native,Android,C++,Opencv,Android Ndk,Native,你能帮我处理我的错误吗?我已经读了很多关于如何修复它们的技巧,但没有任何帮助。我也知道已经有人问过类似的问题,但他们没有帮助我。所以我给你一个机会问你: 我试图让Android应用程序从库中获取图像,并调用C++编写的原生函数,使其变灰。 我的主要活动是: static { if(!OpenCVLoader.initDebug()) { Log.e("tom", "Tomasku opencv problem static");

你能帮我处理我的错误吗?我已经读了很多关于如何修复它们的技巧,但没有任何帮助。我也知道已经有人问过类似的问题,但他们没有帮助我。所以我给你一个机会问你:

我试图让Android应用程序从库中获取图像,并调用C++编写的原生函数,使其变灰。 我的主要活动是:

static {
        if(!OpenCVLoader.initDebug())
        {
            Log.e("tom", "Tomasku opencv problem static");
        }
        else
        {
            Log.e("tom", "OPENCV NACITANE");
            System.loadLibrary("halgorithm");
        }
    }
***在同一个活动中,我调用另一个活动(EditorActivity):

***在我的编辑活动中:

Intent i = new Intent(this, EditorActivity.class);
                ...
                i.putExtra("path", selectedImagePath); //path to image from gallery
                startActivity(i);
...
public native int fce(long matAddrRgba, long matAddrGray);
...

fce(image.getNativeObjAddr(), image_gray.getNativeObjAddr());
// and here it crashes
**在我的halgorithm.cpp中

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"

//using namespace std;
using namespace cv;

extern "C"
{

JNIEXPORT jint JNICALL Java_com_example_hematoma_MainActivity_fce(JNIEnv*, jobject, jlong addrRgba, jlong addrGray) {

    Mat& mRgb = *(Mat*)addrRgba;
    Mat& mGray = *(Mat*)addrGray;

    int conv;
    jint retVal;

    conv = toGray(mRgb, mGray);
    retVal = (jint)conv;

    return retVal;

}

}

int toGray(Mat img, Mat& gray)
{
    cvtColor(img, gray, CV_RGBA2GRAY); // Assuming RGBA input

    if (gray.rows == img.rows && gray.cols == img.cols)
    {
        return 1;
    }
    return 0;
}
***LogCat

04-30 13:16:28.320: W/dalvikvm(3863): No implementation found for native Lcom/example/hematoma/EditorActivity;.fce (JJ)I
04-30 13:16:28.320: D/AndroidRuntime(3863): Shutting down VM
04-30 13:16:28.320: W/dalvikvm(3863): threadid=1: thread exiting with uncaught exception (group=0x40185760)
04-30 13:16:28.320: E/AndroidRuntime(3863): FATAL EXCEPTION: main
04-30 13:16:28.320: E/AndroidRuntime(3863): java.lang.UnsatisfiedLinkError: fce
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.example.hematoma.EditorActivity.fce(Native Method)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.example.hematoma.EditorActivity$3.onClick(EditorActivity.java:166)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.view.View.performClick(View.java:3110)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.view.View$PerformClick.run(View.java:11934)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Handler.handleCallback(Handler.java:587)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Looper.loop(Looper.java:132)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at java.lang.reflect.Method.invoke(Method.java:491)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at dalvik.system.NativeStart.main(Native Method)
04-30 13:36:21.760: W/dalvikvm(4255): No implementation found for native Lcom/example/hematoma/EditorActivity;.fce (JJ)I
04-30 13:36:21.760: D/AndroidRuntime(4255): Shutting down VM
04-30 13:36:21.760: W/dalvikvm(4255): threadid=1: thread exiting with uncaught exception (group=0x40185760)
04-30 13:36:21.760: E/AndroidRuntime(4255): FATAL EXCEPTION: main
04-30 13:36:21.760: E/AndroidRuntime(4255): java.lang.UnsatisfiedLinkError: fce
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.example.hematoma.EditorActivity.fce(Native Method)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.example.hematoma.EditorActivity$3.onClick(EditorActivity.java:166)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.view.View.performClick(View.java:3110)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.view.View$PerformClick.run(View.java:11934)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Handler.handleCallback(Handler.java:587)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Looper.loop(Looper.java:132)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at java.lang.reflect.Method.invoke(Method.java:491)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at dalvik.system.NativeStart.main(Native Method)
提前谢谢

****************************编辑***********************

在你的建议之后,我改变了:

***在Android.mk中:

JNIEXPORT jint JNICALL 
Java_com_example_hematoma_**EditorActivity**_fce(JNIEnv*, jobject, jlong addrRgba, jlong addrGray) {...}
***在EditorActivity中: 我在原生方法之前调用System.loadLibrary(“halgorithm”)

static {
        if(!OpenCVLoader.initDebug())
        {
            Log.e("tom", "Tomasku opencv problem static");
        }
        else
        {
            Log.e("tom", "OPENCV NACITANE");
            System.loadLibrary("halgorithm");
        }
    }
但它并没有纠正我的错误。存在相同的错误:/

***LogCat

04-30 13:16:28.320: W/dalvikvm(3863): No implementation found for native Lcom/example/hematoma/EditorActivity;.fce (JJ)I
04-30 13:16:28.320: D/AndroidRuntime(3863): Shutting down VM
04-30 13:16:28.320: W/dalvikvm(3863): threadid=1: thread exiting with uncaught exception (group=0x40185760)
04-30 13:16:28.320: E/AndroidRuntime(3863): FATAL EXCEPTION: main
04-30 13:16:28.320: E/AndroidRuntime(3863): java.lang.UnsatisfiedLinkError: fce
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.example.hematoma.EditorActivity.fce(Native Method)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.example.hematoma.EditorActivity$3.onClick(EditorActivity.java:166)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.view.View.performClick(View.java:3110)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.view.View$PerformClick.run(View.java:11934)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Handler.handleCallback(Handler.java:587)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.os.Looper.loop(Looper.java:132)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at java.lang.reflect.Method.invoke(Method.java:491)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
04-30 13:16:28.320: E/AndroidRuntime(3863):     at dalvik.system.NativeStart.main(Native Method)
04-30 13:36:21.760: W/dalvikvm(4255): No implementation found for native Lcom/example/hematoma/EditorActivity;.fce (JJ)I
04-30 13:36:21.760: D/AndroidRuntime(4255): Shutting down VM
04-30 13:36:21.760: W/dalvikvm(4255): threadid=1: thread exiting with uncaught exception (group=0x40185760)
04-30 13:36:21.760: E/AndroidRuntime(4255): FATAL EXCEPTION: main
04-30 13:36:21.760: E/AndroidRuntime(4255): java.lang.UnsatisfiedLinkError: fce
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.example.hematoma.EditorActivity.fce(Native Method)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.example.hematoma.EditorActivity$3.onClick(EditorActivity.java:166)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.view.View.performClick(View.java:3110)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.view.View$PerformClick.run(View.java:11934)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Handler.handleCallback(Handler.java:587)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.os.Looper.loop(Looper.java:132)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at android.app.ActivityThread.main(ActivityThread.java:4123)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at java.lang.reflect.Method.invokeNative(Native Method)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at java.lang.reflect.Method.invoke(Method.java:491)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
04-30 13:36:21.760: E/AndroidRuntime(4255):     at dalvik.system.NativeStart.main(Native Method)

<> >代码>公共本机INTFCE(…)<代码>是EdgRealPosivs/Cuth>的成员,但在C++代码中,您调用了函数“代码> JavaSoCo示例Excel PrimeViviyFiCE < /C> 将其重命名为
Java\u com\u example\u EditorActivity\u fce

在调用本机函数之前,不要忘记调用
System.loadLibrary()
,例如在活动中添加:

static {
    System.loadLibrary("halgorithm");
}

经过几天的绝望,我终于解决了我的问题。问题是$(OPENCV_INSTALL_MODULES)应该相等。在我的Android.mk文件的OPENCV_INSTALL_MODULES:=on行

我覆盖了OPENCV安装模块:=打开

OPENCV\u安装\u模块=on

现在它起作用了。。。。也许这对其他人也会有帮助:)

如果你还有其他问题,请关注文章

unsatisfied link
Android studio在opencv4上出现错误


几次重命名就可以解决这个问题。

我忘了先问一下。我不确定应该在哪里调用System.loadLibrary(“halgorithm”);。在我的主要活动中,什么是启动应用程序,或者在活动中什么是调用本机函数(在我的例子中是“fce”?@User中),在调用本机函数之前,您必须调用
System.loadLibrary()
,例如在活动中的
static
块中,请参阅我的更新。因此,如果我调用System.loadLibrary()在Main activity what call中,我使用本机方法的另一个activity并不意味着在本机之前调用。simplier:我应该在使用本机函数但不在主活动中的活动中调用System.loadLibrary()吗。我理解正确吗?@User无论何时何地调用它都无关紧要,只要是在调用本机方法之前调用。愚蠢的问题,但是在致命异常之前日志中是否有
OPENCV NACITANE
?是的,我有。我很抱歉我愚蠢的日志描述:D