2017-02-24 12 views
11

Jako dowód koncepcji, próbuję skompilować i wykorzystać moc biblioteki this dla aplikacji na Androida. Używam studia Android. Co robiłem do tej pory było:Kompilowanie biblioteki C dla Androida

  1. NDK zainstalowana i SDK (chciałbym kierować android 4.0.3 i wyżej, jeśli to możliwe)
  2. stworzył projekt w android Android Studio
  3. stworzył Folder JNI w
  4. przechowywane całą zawartość biblioteki w moim folderze JNI
  5. Związany mój build.gradle do pliku Android.MK, który był obecny w źródłach

    externalNativeBuild { 
        ndkBuild { 
         path 'src/main/jni/Android.mk' 
        } 
    } 
    
  6. Set ProductFlavors w celu uniknięcia próbuje zrobić zbudować dla architektur, które nie są obsługiwane przez bibliotekę (może się mylę tutaj już)

    productFlavors { 
        dev { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        develx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        production { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
        productionx86 { ndk.abiFilters 'x86', 'armeabi', 'armeabi-v7a' } 
    } 
    
  7. W tym momencie zauważyłem, że niektóre pliki takie jak cPU-miner.c brakuje niektórych obejmuje podświetlając je za zaginione, a konkretnie

    #include <curl/curl.h> 
    #include <openssl/sha.h>` 
    

poszedłem więc do oficjalnych stronach tych dwóch bibliotek i pobraniu sou rces, utworzył dwa odpowiednie foldery i umieścił tam wszystkie pliki. W OpenSSL był plik h.in - konfiguracja, jak rozumiem. Udało mi się uzyskać skonfigurowany od here (może być również miejscem, gdzie popełniłem błąd)

  1. Dodałem plik Application.mk do katalogu głównego JNI z następującą treścią APP_ABI:= armeabi armeabi-v7a x86, aby wykluczyć niektóre architektury, których nie obsługuję.

W tym momencie, mam pewne problemy - jednym z nich jest to, że nie można rzeczywiście zbudować mój JNI rzeczy z NDK-build - sched.h nie zostanie rozwiązany (nawet jeśli zwiększy wersji API do 20) . Powoduje to błędy, takie jak:

JNI/cpu-miner.c:473:2: error: use of undeclared identifier 'cpu_set_t' 
    cpu_set_t set; 
jni/cpu-miner.c:474:12: error: use of undeclared identifier 'set' 
    CPU_ZERO(&set); 

więc pytania są:

  1. W jaki sposób można wymusić build rozwiązać sched.h?
  2. Czy moje podejście było poprawne z pobieraniem i dodawaniem źródeł brakujących bibliotek lub istniała jakaś inna opcja - zakładam, że tak jest, ponieważ nie zostały one zawarte w kodzie źródłowym biblioteki? Jeśli tak - czy ktoś mógłby podać instrukcje, jak to zrobić z NDK (lub nie ma znaczenia, co używam do tego?)
  3. Jak tylko naprawię kompilację biblioteki wystarczy wygenerować interfejs java moje pliki c i zacznij z nich korzystać lub są dodatkowe kroki do rozważenia?

    Proszę poprosić o dodatkowe informacje, jeśli potrzebujesz, dziękuję z góry.
    Nota prawna: Jestem programistą a.NET, więc prosimy o bardziej szczegółowe informacje na temat rzeczy z Androidem/C tam, gdzie to możliwe.
    Oświadczenie 2: Ten program jest tworzony dla celów edukacyjnych jako dowód koncepcji.

+1

include wygląda jak działa. Problem, który powoduje, nie jest zdefiniowany. jeśli spojrzysz na https://android.googlesource.com/platform/development/+/73a5a3b/ndk/platforms/android-20/include/sched.h - istnieje interesująca ochrona makr '_GNU_SOURCE' – j2ko

+0

Tak naprawdę mam to '#define _GNU_SOURCE' na początku cpu-miner.c – HardLuck

+1

mówi tylko, że problem może być w jakiś sposób związany ze znaczeniem makra' _GNU_SOURCE' w kontekście NDK. – j2ko

Odpowiedz

1

Wygląda na to, że cpu_set_t nie dotarł do nagłówków NDK aż do Androida-21.

NDK r14 (niewydane, ale powinno zostać wycofane w przyszłym tygodniu) całkowicie przerobił nagłówki, aby mieć dostęp do definicji i stałych struct (niezależnie od tego, czy potrzebne API będą dostępne przed 21 to inne pytanie). Aby z nich skorzystać, chwyć r14 beta i postępuj zgodnie z instrukcjami dla unified headers.

+0

Podniesienie wersji api do 21 spowodowało, że kod nie był czerwony, ale błąd dustrowania kompilacji nadal istnieje, a sama zawartość jest szara. Sprawdziłem i wskazuje na wersje 21 teraz – HardLuck

+0

Zgaduję, że nie udało się tylko niektórym ABI. Spróbuj @ AlexCohn sugestii uruchomienia 'ndk-build' bezpośrednio. Jeśli to działa, spróbuj rozszerzyć 'APP_ABI' tak, aby zawierało armeabi-v7a i x86, dopóki nie znajdziesz takiego, który zawiedzie. Pomocne może być dane wyjściowe dowolnego z tych poleceń. –

0

Spróbuj dodać ten przed włączeń <sched.h>

#define _GNU_SOURCE 

W przypadku, jeśli to nie działa, po prostu dodaj poniżej struktury w ciebie cpu-miner.c pliku:

#define CPU_SETSIZE 1024 
#define __NCPUBITS (8 * sizeof (unsigned long)) 
typedef struct 
{ 
    unsigned long __bits[CPU_SETSIZE/__NCPUBITS]; 
} cpu_set_t; 
+0

Dziękuję. Pomogło mi to przejść dalej, ale mam teraz mnóstwo błędów, takich jak 'jni/cpu-miner.c: 1487: error: undefined reference to 'json_object_get'',' jni/compat/jansson/jansson.h: 109 : błąd: niezdefiniowane odwołanie do 'json_delete'', 'jni/cpu-miner.c: 2900: error: niezdefiniowane odwołanie do' json_load_file'' i tak dalej. – HardLuck

+0

Czy masz bibliotekę json w zestawie? Spróbuj dodać LOCAL_LDLIBS: = -ljson w swoim Android.mk – BhanuSingh

+0

Jeszcze raz dziękuję za twoje wejście. Dodanie tej linii zaczęło powodować błąd 'error: can not find -ljson'. P.S. nawet bez tej linii mogę przejść do określonego typu z kodu, jest on przechowywany w 'jansson.h', więc myślę, że problem może być gdzieś indziej – HardLuck

Powiązane problemy