2016-04-20 10 views
6

Używam aplikacji gradlew do kompilowania aplikacji na Androida, która ma statyczną zależność od biblioteki. W jakiś sposób mam niezdefiniowane odniesienie do bsd_signal.Łącznik z Androidem: niezdefiniowane odniesienie do bsd_signal

Udało mi się skompilować tę aplikację ze stopniem 1.X, ale byłem zobowiązany przejść na gradle 2.10 i usunąć mój plik Android.mk na rzecz umieszczenia większej ilości instrukcji budowy w moim pliku gradle.build, i to jest miejsce problem powstaje.

Czy ktoś może mi powiedzieć, czy istnieje biblioteka, która definiuje bsd_signal, którą powinienem połączyć z moim projektem?

wyjście Compiler

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: Oto mój plik gradle.build

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' 
} 

To mi wygląda bsd_signal jest zdefiniowane w składowej platforms/android-9/arch-x86/usr/lib/libc.asignal.o, ale nawet z moim numerem telefonu ldLibs powyżej, w tym c, pojawia się błąd.

Odpowiedz

13

Till android-19 włącznie NDK-s signal.h oświadczył bsd_signalextern i signal był inline dzwoni bsd_signal.

Począwszy android-21signal jest externbsd_signal i nie jest zadeklarowana w ogóle.

Co ciekawe, bsd_signal nadal był dostępny jako symbol w NDK r10e android-21libc.so (więc nie było żadnych błędów łączących w przypadku korzystania r10e), ale nie jest dostępny w NDK r11 iw górę.

Usuwanie bsd_signal z NdK-s Android 21 +libc.so powoduje łączenie błędów jeśli kod zbudowany Android 21 + jest połączony z bibliotekami statyczne wbudowane w dolnych poziomach NdK wywołujących signal lub bsd_signal. Najbardziej popularną biblioteką, która nazywa się signal jest OpenSSL.

UWAGA: Budowanie te statyczne bibliotekami z android-21 + (która stawiałaby signal symbol bezpośrednio) by połączyć w porządku, ale spowodowałoby *.so upadającego załadować na starsze urządzenia Android OS powodu signal symbol nie znaleziono w ich libc.so.

Dlatego lepiej trzymać się z < = android-19 dla każdego kodu, który wywołuje signal lub bsd_signal.

Aby połączyć bibliotekę zbudowaną z < android-21 skończyło się deklarowania bsd_signal owijkę, która nazwałbym bsd_signal z libc.so (jest jeszcze dostępna w urządzeniu libc.so, nawet do Androida 7.0).

#if (__ANDROID_API__ > 19) 
#include <android/api-level.h> 
#include <android/log.h> 
#include <signal.h> 
#include <dlfcn.h> 

extern "C" { 
    typedef __sighandler_t (*bsd_signal_func_t)(int, __sighandler_t); 
    bsd_signal_func_t bsd_signal_func = NULL; 

    __sighandler_t bsd_signal(int s, __sighandler_t f) { 
    if (bsd_signal_func == NULL) { 
     // For now (up to Android 7.0) this is always available 
     bsd_signal_func = (bsd_signal_func_t) dlsym(RTLD_DEFAULT, "bsd_signal"); 

     if (bsd_signal_func == NULL) { 
     // You may try dlsym(RTLD_DEFAULT, "signal") or dlsym(RTLD_NEXT, "signal") here 
     // Make sure you add a comment here in StackOverflow 
     // if you find a device that doesn't have "bsd_signal" in its libc.so!!! 

     __android_log_assert("", "bsd_signal_wrapper", "bsd_signal symbol not found!"); 
     } 
    } 

    return bsd_signal_func(s, f); 
    } 
} 
#endif 

PS. Wygląda bsd_signal symbol zostanie sprowadzony do libc.so w NDK r13:

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

+1

również to nagłówki mogą prawdopodobnie potrzebne #ifdef __ __ ANDROID #include #include #include #include #endif –

+0

@AntonPechenko Taa, jasne, zjedzmy je w kodzie moją odpowiedź. –

+1

Czy nie miałoby sensu ładowanie sygnału przez dlsym, gdy nie znaleziono bsd_signal, ponieważ jeden z nich jest zawsze dostępny? Rozumiem, że plik bsd_signal został znaleziony w urządzeniu libc.so do wersji Androida 7.0, a bsd_signal powraca w r13, ale ze względu na ogromną różnorodność urządzeń z systemem Android wydaje się to rozsądną gwarancją. Czy wystąpią jakiekolwiek negatywne konsekwencje? –

Powiązane problemy