Компиляция библиотеки C для Android

Как доказательство концепции, я пытаюсь скомпилировать и использовать силу этой библиотеки для приложения для Android. Я использую студию Android. Что я сделал до сих пор:

  • Установленные NDK и SDK (я хотел бы настроить целевую версию Android 4.0.3 и выше, если это возможно)
  • Создал проект Android в Android Studio
  • Создал папку JNI в
  • Сохранено содержимое библиотеки в папке JNI
  • Связал мой build.gradle с файлом Android.MK, который присутствовал в источниках

    externalNativeBuild {
         ndkBuild {
             path 'src/main/jni/Android.mk'
         }
    }
    
  • Установите ProductFlavors, чтобы не пытаться создать сборку для архитектур, которые не поддерживаются библиотекой (возможно, я уже здесь не ошибаюсь)

    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' }
    }
    
  • На этом этапе я заметил, что некоторые файлы, такие как cpu-miner.c, отсутствуют, некоторые из них выделяют их как отсутствующие, в частности

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

Итак, я пошел на официальные сайты этих двух библиотек и загрузил источники, создал две соответствующие папки и разместил там все файлы. В OpenSSL был файл h.in - конфиг, как я понимаю. Я смог получить сконфигурированный из здесь (также может быть местом, где я допустил ошибку)

  1. Я добавил Application.mk в корневой каталог JNI со следующим содержимым APP_ABI:= armeabi armeabi-v7a x86, чтобы исключить некоторые из архитектур, которые я не поддерживаю.

В этот момент у меня есть некоторые проблемы - одна из них заключается в том, что я не могу фактически создать свой материал JNI с помощью NDK-build - sched.h не будет разрешен (даже если я увеличу версию API до 20). Это приводит к ошибкам, например:

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);

Итак, вопросы:

  • Как я могу заставить конструкцию разрешить sched.h?
  • Был ли мой подход корректным с загрузкой и добавлением источников отсутствующих библиотек или был какой-то другой вариант - я предполагаю, что это действительно так, потому что они не были включены в исходный код библиотеки? Если да - может ли кто-нибудь, пожалуйста, дать инструкции, как это сделать с NDK (или это не имеет значения, что я использую для этого?)
  • Как только я исправлю сборку библиотеки, этого будет достаточно, чтобы просто создать java-интерфейс для моих c файлов и начать использовать их или есть дополнительные шаги для рассмотрения?

    Пожалуйста, не стесняйтесь спрашивать о каких-либо дополнительных деталях, если вам это требуется, спасибо заранее.
    Отказ от ответственности: я разработчик .NET, поэтому, пожалуйста, будьте более конкретными в отношении приложений Android и C, где это применимо.
    Отказ 2: эта программа делается для образовательных целей как доказательство концепции.

Ответ 1

Похоже, что cpu_set_t не попал в заголовки NDK до андроида-21.

NDK r14 (неизданный, но должен быть выпущен на следующей неделе) полностью переделал заголовки, чтобы вы получили доступ к определениям и константам структуры (независимо от того, нужны ли вам API-интерфейсы до того, как Android-21 это другой вопрос). Чтобы использовать их, возьмите r14 beta и следуйте инструкциям unified заголовки.

Ответ 2

Попробуйте добавить это перед тем, как включить <sched.h>

#define _GNU_SOURCE

Если он не работает, просто добавьте ниже структуру в файл cpu-miner.c:

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