2015-10-31 39 views
4

我按照這裏本教程中列出試圖安裝的Android工作室opencv的:https://www.youtube.com/watch?v=OTw_GIQNbD8OpenCV的Android的 - 無法解析對應JNI功能

我可以通過給本教程的人所獲得的結果,但在試圖實際使用一些Opencv的功能我遇到了一些麻煩。

我能夠加載Opencv庫,但嘗試使用一些本機功能,如「Imgcodecs.imread」時,我得到的錯誤:「.lang.UnsatisfiedLinkError:找不到長的org.opencv.imgcodecs實現。 Imgcodecs.imread_1(java.lang.String中)」

我相信我有這個問題找到了以下內容:[![在這裏輸入的形象描述] [1]

[1]

看來Android Studio無法檢測到我猜測應該從jniLibs文件夾中獲取的本機C++代碼,我現在在app/src/main中有這些代碼?

我試過更新Android Studio到最新的穩定版本,並且我已經修復了我的android SDK和NDK的文件路徑,因爲有白色空格會顯然影響本機代碼的運行。問題仍然存在。

我一直在試圖解決這個過去的4個小時,任何幫助將不勝感激!

+0

哪個Java文件在屏幕截圖中顯示錯誤? –

+0

@AlexCohn Imgcodecs.java in openCVLibrary300/src/main/java/org/opencv/imgcodecs – ConorB

+0

我會說 - 忽略這個錯誤,它只是Android Studio無法理解本地庫。但是我沒有關於OpenCV的Java包裝的第一手經驗。 –

回答

2

最後編輯:我做了一個教程,說明如何爲Android與SIFT/SURF算法一起安裝OpenCV - https://www.youtube.com/watch?v=cLK9CjQ-pNI

看來,我已經解決了我的問題,使用下面的文件結構和依賴性。我無法確定我是如何運作的,但我相信如果你在這裏複製我的結構,那麼你的工作也應該如此。

確保在您的Android SDK或NDK的文件路徑中不存在空格。 Android Studio警告說,這可能會導致加載本機代碼時出現問題。

將包含'* .so'文件的文件夾放入/ YOUR_PROJECT_ROOT/libs中(您可能必須手動創建該libs文件夾)。 所有其他解決方案在線聲明將它們放到app/src/main/jniLibs中並不適用於我。

要包括openCVLibrary300,我進口它使用文件 - >新建 - >導入模塊,在設置源目錄類似.. \ OpenCV的,Android的SDK \ SDK \ java中

確保模塊的build.gradle在應用和導入的庫共享相同的最小和最大SDK版本等

示例代碼用於測試兩個文件 - http://pastebin.com/2zzU5B9G

我上面張貼的代碼示例確保庫加載在使用Opencv方法之前。它使用Imgcodecs.imread()函數,該函數使用C++中的本地代碼,該函數以前給我提供了「.lang.UnsatisfiedLinkError:未找到針對long org.opencv.imgcodecs.Imgcodecs.imread_1(java.lang.String)的實現」錯誤。

enter image description here

enter image description here

enter image description here

+0

本週末我剛剛設置了這個教程:https://blog.hig.no/gtl/2015/10/01/android-studio-opencv/它的工作,但我注意到我的apk很大,幾乎是40megs,因爲它會將所有本機二進制文件添加到apk中。我正在考慮是否可以刪除所有這些原生lib二進制文件,並讓它使用安裝在手機上的Android Opencv管理器,但我不完全清楚它是如何工作的。 – medloh

+0

@medloh:你有沒有找到** split **的解決方案來減小APK的大小? –

+0

是的,我現在使用Opencv管理器。它大大減少了我的APK的大小,因爲我的APK中不再包含本機代碼。唯一的缺點是用戶必須首先安裝opencv管理器,但如果他們在運行應用程序時尚未安裝opencv管理器,則會自動提示他們這樣做。所有你需要做的就是調用OpenCVLoader.initAsync(),然後它會奇蹟般地從OpenCV管理器中找到它需要的所有本地opencv庫。 – medloh

3

我認爲我是合適的人來給你這個問題的實際答案掙扎了前一週解決與Android Studio中的NDK問題之後。這意味着你已經解決了這個問題,但是我可以提供更多關於如何設置自己的本地文件的信息,以備需要時使用。

您必須知道的第一件事是,當前Android Studio仍然存在一些內部漏洞,並且Java源文件中的本地函數聲明可能仍會觸發「無法解析...」消息。實際上,只要你所有的源代碼都是正確的,並且你已經正確完成了編譯,沒有什麼是錯的。

如果您的項目中沒有自己的本機文件(C++,C),只需將.a或.so本機庫放置在src/main/jniLibs文件夾中,並且不必修改任何內容在gradle文件中。系統會自動爲您做所有事情。

如果你有自己的本地文件並將它們放在src/main/jni文件夾中,那麼你必須創建自己的makefile並將它們放入jni文件夾中。您還必須修改應用程序模塊中的gradle文件。

這裏是我做了的OpenCV的人臉檢測樣品,我從這個奇妙的職位(Here),這實際上是從另一個人的方法修改爲更簡單的執行得到了原代碼:

我的項目結構: Project Structure

我生成文件(請確保您有庫的SDK原在makefile參考):

Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include /home/ng/Desktop/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp 
LOCAL_C_INCLUDES += $(LOCAL_PATH) 
LOCAL_LDLIBS  += -llog -ldl 

LOCAL_MODULE  := detection_based_tracker 

include $(BUILD_SHARED_LIBRARY) 

Application.mk:

APP_STL := gnustl_static 
    APP_CPPFLAGS := -frtti -fexceptions 
    APP_ABI := armeabi-v7a armeabi 
    APP_PLATFORM := android-19 

應用模塊中我gradle.build文件:

apply plugin: 'com.android.application' 
android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     applicationId "org.opencv.samples.facedetect" 
     minSdkVersion 14 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    sourceSets.main.jni.srcDirs = [] 

    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { 
     // ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
       'NDK_PROJECT_PATH=build/intermediates/ndk', 
       'NDK_LIBS_OUT=src/main/jniLibs', 
       'APP_BUILD_SCRIPT=src/main/jni/Android.mk', 
       'NDK_APPLICATION_MK=src/main/jni/Application.mk' 
    } 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.0' 
    compile project(':openCVLibrary300') 
} 

你實際上並沒有改變其他gradle這個文件編譯的本地部分項目。 您也可以通過命令行編譯本地源代碼,並將.so文件放回jniLibs文件夾。這也適用。 我希望這可以幫助你的問題。

相關問題