Android es un sistema operativo basado en Linux, por lo que es posible que desee ejecutar ARM Linux, como Raspberry Pi. Pero, de hecho, todavía hay problemas, principalmente porque la biblioteca de Android reemplaza a glibc como la biblioteca estándar a través de Bionic libc. Hay muchas diferencias entre los dos y no se pueden usar directamente.
Para resolver este problema, apareció la biblioteca libhybris, cuya función principal es hacer referencia a la biblioteca de Android con el método de Bionic libc, Link to glibc, para obtener el soporte de la biblioteca de Android en ARM Linux. libhybris se usó originalmente para hacer que todas las distribuciones de Linux admitieran controladores de Android. Por ejemplo, Ubuntu Touch y Sailfish OS usan esta biblioteca para ser compatibles con dispositivos Android. El diagrama esquemático es el siguiente:
La función principal de libhybris es resolver el problema de compatibilidad de la biblioteca libc. El propósito es ejecutar aquellas bibliotecas compiladas con bionic (principalmente la biblioteca HAL de código cerrado en Android) en el sistema basado en la biblioteca GNU C. Se utiliza en Ubuntu touch, WebOS, Jolla Sailfish OS y otros sistemas. Sin embargo, debido a que estos sistemas se basan en la ecología glibc, la mayoría de los controladores proporcionados por los fabricantes de hardware existentes están escritos para Android y se compilan naturalmente con bionic. Luego viene la pregunta, no es tan fácil persuadir a los fabricantes para que escriban otro conjunto de controladores. Incluso si está escrito, tomará algún tiempo madurar. Entonces, ¿cómo hacer que los sistemas basados en glibc reutilicen los controladores de Android existentes? Esto requiere una capa de compatibilidad como libhybris.
1. Compilación de la biblioteca En
primer lugar, debe preparar una máquina de arquitectura de brazo que ejecute el sistema Linux, lo mejor es instalar el último sistema Debian o Ubuntu. Esto no compilará algunos errores extraños
下载libhybris源码
# git clone https://github.com/libhybris/libhybris.git
# ./autogen.sh
Si está buscando encabezados de Android ... no aparece. Se detuvo y no se generó Makefile. Lo siguiente es para que lo resuelva, si se trata de otros errores, por favor, Baidu (generalmente el entorno no es bueno)
¿Qué es este encabezado de Android? También he estado involucrado durante mucho tiempo, pero encontré las palabras encabezados de Android en el código fuente utils / extract-headers.sh
ANDROID_ROOT es, por supuesto, el código fuente de Android, los encabezados de Android se pueden descargar desde el sitio web oficial del sistema ubuntu
Ejecute el script después de la descarga
提取android头文件
# ./extract-headers.sh android-aosp/ /tmp/android-headers/ 4 2 2
这里4 2 2编译不过,就去掉了4 2 2 ,
然后在android-headers目录
# make install。
Luego regrese a libhybris y ejecute ./autogen.sh sin error. Después de compilar make, hay libandroid-properties.so y libhybris-common.so. Cópielo en el directorio de archivos / usr / lib, y copie el archivo de inclusión en el directorio / usr / include. Por supuesto, puede usar make install, pero no sé cómo usar otras bibliotecas, por lo que no hay copia
Luego cree un nuevo directorio / system / lib64 en el directorio raíz (mi sistema es de 64 bits). Este directorio almacena la biblioteca de Android y sus bibliotecas dependientes. Copie android build.prop en el directorio del sistema
2. El uso de la biblioteca
Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libfoo
LOCAL_SRC_FILES:= foo.cpp
include $(BUILD_SHARED_LIBRARY)
foo.cpp :
#include <stdio.h>
#include <stdlib.h>
void foo(void)
{
printf("foo\n");
printf("%s\n", getenv("PATH"));
}
void bar(void)
{
foo();
printf("bar\n");
}
android库拷贝至linux系统的/system/lib64目录下
通过libhybris,调用bar函数:
#include <stdio.h>
#include <hybris/common/dlfcn.h>
#include <string.h>
#include <errno.h>
int main(void)
{
void *handle;
void (*bar)(void);
handle = hybris_dlopen("libfoo.so", RTLD_NOW);
if (NULL == handle)
{
fprintf(stderr, "android_dlopen failed: %s\n", strerror(errno));
return -1;
}
bar = (void (*)(void))hybris_dlsym(handle, "_Z3barv");
if (NULL == bar)
{
fprintf(stderr, "fail to dlsym: %s\n", strerror(errno));
return -1;
}
bar();
return 0;
}