[英]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.