2012-06-01 23 views
12

Android'de kullanmak istediğim OpenCV kodu (C++) var. Bunu yapmak için Android NDK kullanmalıyım. OpenCV package for Android development (ver. 2.4.0) indirdim ve bu kılavuzdaki tüm adımları yaptım. Temel örnekler (yalnızca Java API'sı) sorunsuz çalışır. Örnek # 3 (Eğitici 3 (Gelişmiş) - Yerel OpenCV Ekle), ndk-oluşturucudan doğru şekilde oluşturulmuştur.Yerel kütüphane OpenCV Android örneği bağlanılamıyor

05-31 23:41:45.976: W/ActivityThread(9708): Application org.opencv.samples.tutorial3 is waiting for the debugger on port 8100... 
05-31 23:41:45.983: I/System.out(9708): Sending WAIT chunk 
05-31 23:41:45.983: I/dalvikvm(9708): Debugger is active 
05-31 23:41:46.179: I/System.out(9708): Debugger has connected 
05-31 23:41:46.179: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:46.382: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:46.585: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:46.788: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:46.983: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:47.186: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:47.389: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:47.585: I/System.out(9708): waiting for debugger to settle... 
05-31 23:41:47.788: I/System.out(9708): debugger has settled (1463) 
05-31 23:41:47.819: D/szipinf(9708): Initializing inflate state 
05-31 23:41:47.866: I/Sample::Activity(9708): Instantiated new class org.opencv.samples.tutorial3.Sample3Native 
05-31 23:41:48.909: D/dalvikvm(9708): threadid=1: still suspended after undo (sc=1 dc=1) 
05-31 23:41:51.770: I/Sample::Activity(9708): onCreate 
05-31 23:41:59.283: W/dalvikvm(9708): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View; 
05-31 23:42:01.965: D/AndroidRuntime(9708): Shutting down VM 
05-31 23:42:01.965: W/dalvikvm(9708): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
05-31 23:42:01.999: E/AndroidRuntime(9708): FATAL EXCEPTION: main 
05-31 23:42:01.999: E/AndroidRuntime(9708): java.lang.ExceptionInInitializerError 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at org.opencv.samples.tutorial3.Sample3Native.onCreate(Sample3Native.java:21) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.os.Looper.loop(Looper.java:130) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at dalvik.system.NativeStart.main(Native Method) 
05-31 23:42:01.999: E/AndroidRuntime(9708): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native_sample: findLibrary returned null 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at java.lang.Runtime.loadLibrary(Runtime.java:429) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at java.lang.System.loadLibrary(System.java:554) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  at org.opencv.samples.tutorial3.Sample3View.<clinit>(Sample3View.java:48) 
05-31 23:42:01.999: E/AndroidRuntime(9708):  ... 14 more 

I:

System.loadLibrary("native_sample"); 

İşte tam logcat günlüğü var: Bu satırda

Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View; 

: Ama her zaman Tutulma gelen cihazda/debug onu yönetmeye çalışıyorum istisna var Aynı problem için çözümler bulun ama hiçbiri bana yardımcı olmadı:

  1. Native OpenCV Samples for Android throws UnsatisfiedLinkError
  2. java.lang.UnsatisfiedLinkError: Couldn't load opencv_java: findLibrary returned null
  3. Major OpenCV-Android for Windows Installing and Running Issues (cevap yok)

Ayrıca ben farklı cihazlar ve Android API sürümleri üzerinde test ettik.

Benim sistem konfigürasyonu: Ben ancak hiçbir şans ile (benim serbest zaman :) var) 4 gece için bu sorunu çözmeye çalıştı oldum

[email protected]:~$ uname -a 
Linux astor-K42Jv 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux 

. Tezim için buna gerçekten ihtiyacım var, bu yüzden herhangi bir yardım takdir edilecektir.


Güncelleme: Windows 7 (64) bu örnek test ettik, ancak sonuç aynıdır.

Bu, OpenCV hatası gibi görünüyor.


Güncelleme: Yapı günlüğü: Sen gerçek sorundan çok daha yüksek bir düzeyde olduğunu

[email protected]:/opt/eclipse-android/workspace/OpenCV-2.4.0-samples/tutorial-3-native$ ndk-build 
Install  : libnative_camera_r2.2.0.so => libs/armeabi-v7a/libnative_camera_r2.2.0.so 
Install  : libnative_camera_r2.3.3.so => libs/armeabi-v7a/libnative_camera_r2.3.3.so 
Install  : libnative_camera_r3.0.1.so => libs/armeabi-v7a/libnative_camera_r3.0.1.so 
Install  : libnative_camera_r4.0.0.so => libs/armeabi-v7a/libnative_camera_r4.0.0.so 
Install  : libnative_camera_r4.0.3.so => libs/armeabi-v7a/libnative_camera_r4.0.3.so 
Install  : libnative_sample.so => libs/armeabi-v7a/libnative_sample.so 
+0

[bağlayıcı bayrakları sistem dışı kütüphaneleri] (olası yinelenen http://stackoverflow.com/questions/24669518/non-system-libraries-in-linker-flags) –

cevap

16

Whoohoo! Son olarak bu problemin çözümünü kendim buldum!

Ben ayıklama hattına verdi:

System.loadLibrary("native_sample"); 

Ben Android SDK android kaynak kodunu indirilen Bunu yapmak için ve daha sonra ekli kaynak klasör (/ opt/android-sdk-linux/kaynaklar/android-15) Projem için.

Cannot load library: link_image[1936]: 37 could not load needed library 'libopencv_java.so' for 'libhello-jni.so' (load_library[1091]: Library 'libopencv_java.so' not found) 

Ve gerçekten bu kütüphane lib dizinde değil: O hata buldu Bundan sonra oldu. Nedenini bilmiyorum ama ndk-build onu görmezden geldi. Bu yüzden kopyalamaya ve manuel olarak yüklemeye karar verdim.

static { 
    System.loadLibrary("opencv_java"); //load opencv_java lib 
    System.loadLibrary("native_sample"); 
} 

Aslında benzer sorunlar şunlardır::

  1. Can not load Opencv libraries in necessitas
  2. Android OpenCV: cannot dlopen camera wrapper library

elimden bulundu ikinci çözümü itibaren Bunun için ben /opt/OpenCV-2.4.0/libs/armeabi-v7a den libopencv_java.so ve ayrıca düzenlenmiş java kodu kopyalanan dlopen kullanarak kütüphaneleri yükleyin, ancak henüz denemedim.

Bu yüzden basit bir bash-script yazacağım (sadece kopyalama).

Herkese teşekkürler. Bunun yerine opencv yöneticisi "BaseLoaderCallBack" nde "onManagerConnected" yönteminde bağlandıktan sonra kütüphanenizi yüklemek

static{ 
    System.loadLibrary("YOUR_LIBRARY"); 
} 

olarak yerli kütüphane yüklenmesi

+0

İki satırın eklenmesiyle bile, bazı cihazlarda bu sorunla karşı karşıya geliyorum. –

0

. Eğer

cd <project> 
    <ndk>/ndk-build 

çalıştırdığınızda, "Getting started with the NDK" göster ... ne diyor? (Cygwin penceresini kullanmayı unutmayın ve bir dos istemini değil).

+0

Ne demek "o ne diyor?" Yapı kütüğü varsa, benim sorumun ** güncellemesini ** görün (linux'dan yapıyorum). – ArtemStorozhuk

+0

Hm .. aptalca geliyor ama projeyi ndk-build'den sonra temizledin mi? Ayrıca, "kanca" ya da ne denirse kontrol edin, ... void Java_com_hw_ndk_HWNDKActivity_helloLog (JNIEnv * env, jobject this, jstring logThis) ... com.hw.ndk (paket adı) . Bu konuda kendim yeniyim. – user426364

+0

Elbette, projeyi inşa ettikten sonra temizlemiyorum. Cihazdaki çalıştırma programından sonra bile, kütüphaneler hala lib klasöründedir. Belki javah programı demek istiyorsun? Eğer öyleyse, evet, fonksiyon adını kontrol ettim. – ArtemStorozhuk

1

. Benim kod parçacığı benim için çalışıyor takiben

public void onManagerConnected(int status) { 
       switch(status){ 
       case LoaderCallbackInterface.SUCCESS: 
        Toast.makeText(getApplicationContext(), "manager connected", Toast.LENGTH_LONG).show(); 
        System.loadLibrary("MYNATIVELIB"); 
        break; 
       default: 
        super.onManagerConnected(status); 
        break; 
       } 
      } 
+0

Çok teşekkür ederim! Bu benim için çözüm oldu! – sebasira