Utilice la biblioteca libhybris para hacer que Linux llame a la biblioteca de Android

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:

esquema de libhybris

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;

}

 

Publicado 766 artículos originales · elogiados 474 · 2.54 millones de visitas

Supongo que te gusta

Origin blog.csdn.net/u010164190/article/details/105533354
Recomendado
Clasificación