簡體   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