繁体   English   中英

使用Android NDK的OpenCV-“无法解决”错误

[英]OpenCV using Android ndk - 'could not be resolved' error

我正在使用NDK开发OpenCV项目。 还有一些Java调用OpenCV的库。 Java调用当前工作正常,项目可以编译并运行良好。 但是,一旦引入了本地调用,应用程序就会崩溃,然后在引用的.cpp文件中显示错误,指出could not be resolved错误(例如, Symbol 'cv' could not be resolved )。 在打开cpp文件之前,似乎没有错误,这是应用程序最初运行的方式。 每次重新启动Eclipse时,错误都不会出现,直到如上所述触发为止。

我已经在OpenCV提供的示例之一(即示例3-本机)上预先测试了cpp文件,并且工作正常,因此它必须在链接过程中。

项目属性详细信息和问题研究

在浏览并比较当前有问题的项目设置和成功运行的OpenCV示例后; 我注意到的差异是:

  • 项目的Current ToolChain (在项目属性中的C/C++ Build > Tool Chain Editor )是Cygwin GCC ,而OpenCV的示例是No ToolChain 我记得在某处读过这是推荐的设置,不确定为什么,但是在将我的Android项目转换为C / C ++项目的早期,我不记得找到可调的工具链选项。

  • 有关项目的ConfigurationDebug [Active]而OpenCV示例中的配置为Default [Active] 我在项目的“ Configuration下拉菜单中找不到后者作为选项。 反过来,在我的项目具有Debug且OpenCV的示例具有Default地方, indexer build configuration (在C/C++ General > Indexer )也有所不同。

下面说明了我项目的上述设置(不是OpenCV的示例):

工具链编辑器设置

工具链编辑器设置

索引器内部配置设置

索引器内部配置设置

该项目是根据建议的建议准备的,可以在大多数教程和有关此问题的问题中找到这些建议; 作为添加必要的项目路径添加NDKROOT路径 (也在此处提到)。 ndk-build命令也已成功运行。

同样,cpp文件中的方法名称被命名为我在OpenCV示例中观察到的命名约定,即遵循这种模式。 Java_packageName_callingJavaClass_functionName

代码和详细结果

以下是Android.mk概述:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=on

include <Full Path To OpenCV>\OpenCV\sdk\native\jni\OpenCV.mk

LOCAL_MODULE    := proc #The name referred to in System.loadLibrary() in the calling Android  activity
LOCAL_SRC_FILES := proc.cpp
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

Application.mk如下:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi

EDIT下面是第一次运行的logcat输出(此后,实现了cpp中的编译错误,即could not be resolved错误形式,因此除非重新启动Eclipse,否则无法运行)。 median是发生崩溃时调用的本机方法。

01-29 19:14:23.786: W/dalvikvm(8750): No implementation found for native Lcom/ocv/MainActivity;.median (JJ)V
01-29 19:14:23.786: W/dalvikvm(8750): threadid=1: thread exiting with uncaught exception (group=0x400207d8)
01-29 19:14:23.786: E/AndroidRuntime(8750): FATAL EXCEPTION: main
01-29 19:14:23.786: E/AndroidRuntime(8750): java.lang.UnsatisfiedLinkError: median
01-29 19:14:23.786: E/AndroidRuntime(8750):     at com.ocv.MainActivity.median(Native Method)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at com.ocv.MainActivity.onActivityResult(MainActivity.java:155)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.Activity.dispatchActivityResult(Activity.java:3890)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3517)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3563)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.ActivityThread.access$2800(ActivityThread.java:126)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2068)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.os.Looper.loop(Looper.java:123)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at android.app.ActivityThread.main(ActivityThread.java:4633)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at java.lang.reflect.Method.invokeNative(Native Method)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at java.lang.reflect.Method.invoke(Method.java:521)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-29 19:14:23.786: E/AndroidRuntime(8750):     at dalvik.system.NativeStart.main(Native Method)

编辑关于使用的代码; 下面的.java活动代码 MainActivity.java是与本机功能相关的摘录。

    // package name
    package com.ocv;

    // Class header
    public class MainActivity extends Activity implements View.OnClickListener{

       // native method declaration    
       public native void median(long matAddrGr, long matAddrRgba);  

       protected void onActivityResult(int requestCode, int resultCode, Intent data) {

           if (OpenCVLoader.initDebug()){

               /* This is line 155 referenced from logcat */
               median(gray_img.getNativeObjAddr(), rgb_img.getNativeObjAddr());
              }
            }
          }

关于本机代码 proc.cpp (遵循与OpenCV示例中所理解的模式类似的模式):

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL Java_com_ocv_MainActivity_median(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{
    Mat* pMatGr=(Mat*)addrGray;
    Mat* pMatRgb=(Mat*)addrRgba;
    vector<KeyPoint> v;

    medianBlur(*pMatGr,*pMatRgb,3);
}
}

关于图书馆的装载 ; OpenCV已成功加载(在出现本机cpp文件错误之前的第一次运行中),如下所示(在调用本机方法median之前,我什Imgproc.cvtColor在Java中(在活动MainActivity.java )也成功调用了Imgproc.cvtColor ):

成功加载OpenCV,如logcat中所示

proc.cpp导致的语义错误

cpp语义错误


上述项目属性的观察结果可能与该问题有关吗? 如果可以,如何修改? 如果不是,则可能是什么原因导致了该错误?

我正在使用Eclipse Indigo Service Release 2(因此解决方案不适用于Eclipse Juno用户)。

我在网上发现了许多类似的问题(其中一些早先已经链接了)。 但到目前为止,所有建议的答案似乎都无法解决该问题。

先感谢您。

  1. cd到jni目录时,尝试使用ndk-build在命令行中进行构建。
  2. 如果生成,请关闭所有cpp编辑器窗口,重新启动Eclipse,但不要打开任何cpp文件。 将您的应用程序作为Android应用程序运行。
  3. 如果运行正常,请打开cpp文件-这次您将看到错误。
  4. 擦除并重新键入所有“使用名称空间”字符串。 我知道这听起来很奇怪,但是当您再次启动Eclipse时,错误应该消失了。 当然,假设您的所有路径都正确。
  5. 关于包含的警告仍然可以在那里。 我不知道为什么,但是手机上的安装有效。

当我遇到类似的问题时,我必须更改此目录

$ {} ProjDirPath SDK /../../ /本地/ JNI /包括

与这个

$ {} ProjDirPath OpenCV的/../-2.4.3.2-Android的SDK / SDK /本地/ JNI /包括

这可能很有用。

但是,有人说,eclipse的一个错误是当包含标头时,eclipse很难实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM