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
- NDK zainstalowana i SDK (chciałbym kierować android 4.0.3 i wyżej, jeśli to możliwe)
- stworzył projekt w android Android Studio
- stworzył Folder JNI w
- przechowywane całą zawartość biblioteki w moim folderze JNI
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' } }
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' } }
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)
- 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ą:
- W jaki sposób można wymusić build rozwiązać
sched.h
? - 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?)
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.
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
Tak naprawdę mam to '#define _GNU_SOURCE' na początku cpu-miner.c – HardLuck
mówi tylko, że problem może być w jakiś sposób związany ze znaczeniem makra' _GNU_SOURCE' w kontekście NDK. – j2ko