[英]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 ++项目的早期,我不记得找到可调的工具链选项。
有关项目的Configuration
为Debug [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
):
proc.cpp
导致的语义错误 :
上述项目属性的观察结果可能与该问题有关吗? 如果可以,如何修改? 如果不是,则可能是什么原因导致了该错误?
我正在使用Eclipse Indigo Service Release 2(因此该解决方案不适用于Eclipse Juno用户)。
我在网上发现了许多类似的问题(其中一些早先已经链接了)。 但到目前为止,所有建议的答案似乎都无法解决该问题。
先感谢您。
当我遇到类似的问题时,我必须更改此目录
$ {} ProjDirPath SDK /../../ /本地/ JNI /包括
与这个
$ {} ProjDirPath OpenCV的/../-2.4.3.2-Android的SDK / SDK /本地/ JNI /包括
但是,有人说,eclipse的一个错误是当包含标头时,eclipse很难实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.