Компиляция библиотеки 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 - конфиг, как я понимаю. Я смог получить сконфигурированный из здесь (также может быть местом, где я допустил ошибку)
- Я добавил 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;