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.a
signal.o
, ale nawet z moim numerem telefonu ldLibs
powyżej, w tym c
, pojawia się błąd.
również to nagłówki mogą prawdopodobnie potrzebne #ifdef __ __ ANDROID #include #include #include #include #endif –
@AntonPechenko Taa, jasne, zjedzmy je w kodzie moją odpowiedź. –
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? –