2016-04-20 22 views
6

Statik lib bağımlılığı olan bir Android uygulamasını derlemek için gradlew çalıştırıyorum. Her nasılsa, bsd_signal için tanımlanmamış bir başvurum var. Android bağlayıcı: bsd_signal için tanımlanmamış başvuru

Ben gradle 1.X Bu uygulamayı derlemek başardı ama 2.10 gradle geçmek için ve benim gradle.build dosyasına daha inşa talimat koyarak lehine benim Android.mk dosya açılır yükümlü ettik ve bu nerede sorun ortaya çıkıyor.

Bana projemle bağlantı kurmam gereken bsd_signal'u tanımlayan bir kütüphane olup olmadığını söyleyen var mı?

Derleyici çıkış

Starting process 'command '/home/myself/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++''. Working directory: /home/myself/projects/DroidEar/app Command: /home/myself/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ @/home/myself/projects/DroidEar/app/build/tmp/linkNativeArmeabi-v7aDebugSharedLibrary/options.txt 
Successfully started process 'command '/home/myself/Android/Sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++'' 
/android/ndk/platforms/android-9/arch-arm/usr/include/signal.h:113: error: undefined reference to 'bsd_signal' 
/android/ndk/platforms/android-9/arch-arm/usr/include/signal.h:113: error: undefined reference to 'bsd_signal' 
collect2: error: ld returned 1 exit status 

TMI: İşte bsd_signalplatforms/android-9/arch-x86/usr/lib/libc.a arasında signal.o bileşeninde tanımlanır gibi bana bakıyor benim gradle.build dosyası

apply plugin: 'com.android.model.application' 

model { 
    repositories { 
     libs(PrebuiltLibraries) {    
      Superpowered { 
       binaries.withType(StaticLibraryBinary) { 
        def prefix = "src/main/jniLibs/Superpowered" 
        headers.srcDir "${prefix}" 
        if (targetPlatform.getName() == "armeabi-v7a") 
         staticLibraryFile = file("${prefix}/libSuperpoweredAndroidARM.a") 
        else if (targetPlatform.getName() == "arm64-v8a") 
         staticLibraryFile = file("${prefix}/libSuperpoweredAndroidARM64.a") 
        else if (targetPlatform.getName() == "x86_64") 
         staticLibraryFile = file("${prefix}/libSuperpoweredAndroidX86_64.a") 
        else if (targetPlatform.getName() == "X86") 
         staticLibraryFile = file("${prefix}/libSuperpoweredAndroidX86.a") 
       } 
      } 
     } 
    } 

    android { 
     compileSdkVersion = 23 
     buildToolsVersion = "23.0.3" 

     sources { 
      main { 
       jni { 
        dependencies { 
         library "Superpowered" linkage "static" 
        } 
       } 
      } 
     } 

     ndk { 
      ldLibs.addAll(['log', 'android', 'c']) 
     } 

     defaultConfig { 
      applicationId = "edu.ucdavis.auditoryenhancer" 
      minSdkVersion.apiLevel = 22 
      targetSdkVersion.apiLevel = 23 
      versionCode = 1 
      versionName = "1.0" 
     } 
    } 

    android.ndk { 
     moduleName = "native" 
    } 

    android.buildTypes { 
     release { 
       minifyEnabled = false 
       proguardFiles.add(file("proguard-rules.pro")) 
     } 
    } 
} 


dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
} 

olmakla bile c dahil olmak üzere benim ldLibs çağrı ile hata alıyorum.

cevap

13

Till android-19 dahil NDK-ler signal.h ilan bsd_signalextern ve signal olan bir satır içi arayarak bsd_signal. android-21signal ile başlayarak

bir extern ve bsd_signal hiç bildirilmedi. ilginç olan şey

, bsd_signal (r10e kullanarak eğer öyleyse vardı hiçbir bağlantı hataları) NDK r10e android-21libc.so bir sembol olarak hala kullanılabilir, ama NDK R11 ve yukarı kullanılamaz. Kod android-21 +signal veya bsd_signal diyoruz düşük NDK seviyeleri ile inşa statik kütüphanelerini ile bağlantılıdır ile inşa eğer hataları bağlayan içinde NDK-ler android-21 +libc.so sonuçlarından bsd_signal çıkarması

. signal numaralı telefonu kullanan en popüler kitaplık, OpenSSL.

UYARI: android-21 + (doğrudan signal sembolü koymak olacaktır) eski Android OS cihazlarını üzerinde yük ince bağlayacak, ama *.so başarısız olmasına neden olur dolayı signal sembol bulunmayan olanlar statik kütüphanelerini oluşturma onlarınki libc.so.

nedenle signal veya bsd_signal çağıran herhangi bir kod için < = android-19 ile sopa daha iyidir.

(hatta Android 7.0 kadar, cihaz en libc.so hâlâ ulaşılabilir) Ben libc.so den bsd_signal çağırır bir bsd_signal sarmalayıcı ilan sona erdi < android-21 ile oluşturulmuş bir kütüphane bağlamak için. PS bsd_signal sembol NDK R13 yılında libc.so geri getirilecek Görünüşe: ayrıca bu başlıklar muhtemelen #ifdef gerekli olabilir

https://github.com/android-ndk/ndk/issues/160#issuecomment-236295994

+1

__ ANDROİD __ #include #include #include Evet, tabii, benim cevap kodunda bunları atalım

+0

@AntonPechenko #endif #include. –

+1

bsd_signal bulunmadığında, bunlardan biri her zaman kullanılabilir olduğundan, dlsym yoluyla sinyal yüklemeye çalışmak mantıklı olmaz mıydı? Bsd_signal'ın, Android 7.0'a kadar olan aygıtın libc.so'sında bulunduğunu ve bsd_signal'ın r13'te geri geldiğini anlıyorum, ancak Android cihazlarındaki büyük çeşitlilik nedeniyle bu, makul bir koruma gibi görünüyor. Herhangi bir olumsuz sonuç olur mu? –

İlgili konular