2016-03-21 25 views
1

libjpeg'e bağlı Android NDK ile oluşturduğum bir yerel kitaplığa ('işlemci') sahibim. Ancak bu sorun Android açısından alakasız olabilir. Ben başarıyla kütüphane kurdu ama kütüphaneyi çalıştırmak istediğinizde bu hata ile düzgün yüklenmemesi ettik:Sembolü bulamıyor

... 
U jpeg_CreateCompress 
U jpeg_CreateDecompress 
U jpeg_destroy_compress 
U jpeg_destroy_decompress 
U jpeg_finish_compress 
U jpeg_finish_decompress 
U jpeg_mem_dest 
U jpeg_mem_src 
U jpeg_read_header 
U jpeg_read_scanlines 
... 

işlemci: Ben gerçekten simgeleri içeren gelmez nm -D processor.so Ancak

failed: dlopen failed: cannot locate symbol "jpeg_mem_src" 

build.gradle:

: ile

sources { 
    main { 
     jni { 
      dependencies { 
       project ":jpeg" 
      } 
     } 
    } 
} 

ndk { 
    moduleName "processor" 
    cppFlags.add("-fexceptions") 
    ldLibs.add("log") 
    stl "gnustl_shared" 
} 

java yan yüklendiğinden

Sembollerin neden var olduğu hakkında bir fikir var, ancak bulunamıyor? Teşekkürler!

cevap

2

Android sürümleri bağlı olarak, el ile jpeg kitaplığı yüklenemedi gerekir (ve çok Apk'nizin içinde yer alıyor!)

Dolayısıyla, sadece statik bloğa bir System.loadLibrary("jpeg"); ekleyin ve hile yapmak gerekir.

Btw, .so dosyanızdaki sembolleri görebilmeniz yalnızca dosyanızın bu dosyaları kullanıyor anlamına gelir, .so numaralı ürününüz için bir uygulama sağlar. için U harfli sembolleri nm olarak bildirebilirsiniz.

+0

Ahh, teşekkürler. Yani 'U' tanımsızlarsa, kütüphaneyi oluştururken yanlış bir şey yapmış olabilirim? (Ben System.loadLibrary ("jpeg") 'yi eklemeyi denedim, ama aynı hatayı alıyorum, bu yüzden bazı nedenlerden dolayı tüm kütüphaneleri hatalı yapıyorum.) – Anthony

+0

libjpeg.so dosyasında: 000000000001dca0 T jpeg_mem_src – Anthony

+0

Kitaplığınız libjpeg'e bağlıdır (build.gradle dosyasındaki bağımlılık bloğunda belirtildiği gibi). Bu, kütüphanenizin kendisinin yüklenebilmesi için yüklenecek 'libjpeg.so' dosyasına ihtiyaç duyduğu anlamına gelir. Dosyanızda bir 'readelf -d' komutunu çalıştırarak bunu kontrol edebilirsiniz, ti diğer gerekli tüm paylaşılan kütüphanelerinizi gösterecektir. Android tarafından her zaman yüklü olduğu için, libc'yi güvenle yok sayabilirsiniz, ancak diğerlerini manuel olarak yüklemelisiniz. – NiBZ