You are on page 1of 23

openSmile:)

sobre SO Android

Que se necesita?
Codigo

Fuente de openSmile:)
Android NDK (Native Developer Kit)
Android SDK (Software Developer Kit)

Procedimiento
Existen dos maneras de ejecutar openSmile:)
Opcion 1: Recompilar codigo fuente desde
Android Studio con NDK para generar la librera
en multiples arquitecturas (arm64-v8a, armeabi,
armeabi-v7a, mips, mips64, x86,, x86_64)
Opcion 2: Ejecutar Script que ofrece audEERING
para generar la librera utilizable por
AndroidStudio.

Procedimiento Opcion2 (FCIL)


Descargar NDK

Descargar openSmile:)

Procedimiento Opcion2

Descomprimir openSmile:) sobre /opt

Mover android-ndk-rxxd-linux-x86-64.bin en /opt

Ejecutar android-ndk-rxxd-linux-x86-64.bin para


descomprimir (./android-ndk-rxxd-linux-x8664.bin)

Renombrar carpeta resultante android-ndk-rxxd


-> android-ndk

Crear una carpeta llamada thirdparty (un nivel


arriba de la carpeta openSMILE-2.1.0, osea
/opt/thirdparty)

Mover carpeta android-ndk ->


/opt/thirdparty/android-ndk

Procedimiento Opcion2

Entrar a /opt/openSMILE-2.1.0

Ejecutar Script buildAndroid.sh

Al terminar tendremos una carpeta ./libs generada


por el Script con las librerias compatibles para
android.

DESVENTAJA se desconoce la arquitectura para la


cual fue compilada.

Procedimiento Opcion2

Para incrustar y hacer uso de las librerias resultantes sobre un proyecto en


android basta con copiar las librerias de la siguiente manera:

**NOTA:

No olvidemos que al no saber la

arquitectura resultante para la cual


el script compil, debemos copiar
la libreria en cada carpeta correspondiente a cada arquitectura.

->

Procedimiento Opcion2

Para hacer uso de la libera es necesario incrustar el siguiente cdigo que carga la
libreria en cualquier clase:

Procedimiento Opcion2

Para hacer uso de metodos de la libera, es


necesario declarar metodos nativos en java, y los
cuales deben de cumplir las siguientes
caracteristicas:

El nombre del metodo debe ser el mismo tanto en


java como en c++

El numero de argumentos debe de ser el mismo tanto


como en el metodo nativo como en el metodo en c++

Los tipos de datos entre los metodos c++ y el metodo


nativo en java deben de ser equivalentes, en c++
deberan ser declarados con clases Wrapper.

El tipo de retorno declarado en el metodo nativo en


java debe de ser equivalente al valor de retorno en
c++

Resultado Opcion2

Procedimiento Opcion1 (COMPLEJO)


Descargar NDK

Descargar openSmile:)

Procedimiento Opcion1

Descomprimimos lo descargado en las siguientes rutas:

NDK -> /opt/android-ndk-rxxd

openSMILE -> /opt/openSMILE-2.1.0

Procedimiento Opcion1

A modo de prueba, generamos un nuevo proyecto en android, y a la clase


principal, le aadimos un metodo nativo, por ejemplo:
private native String saludoDesdeC();

Procedimiento Opcion1

A modo de prueba, generamos un nuevo proyecto en android, y a la clase


principal, le aadimos un metodo nativo, por ejemplo:
private native String saludoDesdeC();

Procedimiento Opcion1

Nos vamos a la terminal, y vamos a usar el comando


javah, para generar un archivo que se encargara de
vincular el codigo C con el codigo Java.

Primero nos posicionamos sobre el nivel de las carpetas java y res


del proyecto

cd <proyecto>/app/src/main

Despues ejecutamos el comando javah

javah -d jni -classpath /home/lab-inv10/Android/Sdk/platforms/android-19/android.jar:/home/lab-inv10/Android/Sdk/extras/android/support/v7/appcompat/libs/androidsupport-v7-appcompat.jar:/home/lab-inv10/Android/Sdk/extras/android/support/v7/appcompat/libs/androidsupport-v4.jar:../../build/intermediates/classes/debug/


mx.cicese.ut3.pruebaopensmile.Principal

Procedimiento Opcion1

Nos vamos a la terminal, y vamos a usar el comando


javah, para generar un archivo que se encargara de
vincular el codigo C con el codigo Java.

Primero nos posicionamos sobre el nivel de las carpetas java y res


del proyecto

cd <proyecto>/app/src/main

Despues ejecutamos el comando javah

javah -d jni -classpath /home/lab-inv10/Android/Sdk/platforms/android-19/android.jar:/home/lab-inv10/Android/Sdk/extras/android/support/v7/appcompat/libs/androidsupport-v7-appcompat.jar:/home/lab-inv10/Android/Sdk/extras/android/support/v7/appcompat/libs/androidsupport-v4.jar:../../build/intermediates/classes/debug/


mx.cicese.ut3.pruebaopensmile.Principal

Procedimiento Opcion1

El resultado de ejecutar el comando javah es el siguiente:

Procedimiento Opcion1

Generamos un fichero main.c sobre la carpeta jni

Y le damos comportamiento al metodo que se genero en la


cabecera de mx_cicese_ut3_pruebaopensmile_Principal.h

Procedimiento Opcion1

Configuramos el IDE AndroidStudio para que trabaje con el NDK y


pueda compilar los archivos .c y .h que se encuentran dentro de la
carpeta jni para que pueda generar las librerias correspondientes en
cada arquitectura.

Esto lo hacemos aadiendo en el archivo local.properties que se


encuentra en la raiz del proyecto la siguiente linea

ndk.dir=/opt/android-ndk-r10d/

Procedimiento Opcion1

Para renombrar la libreria que se va a generar al compilar,


abrimos el archivo build.gradle que esta sobre
<proyecto>/app/main/src y dentro del contexto
defaultConfig aadimos lo siguiente:

Ndk {

moduleName pruebaOpenSmile

Procedimiento Opcion1

Compilamos, y nos vamos a la carpeta


<Proyecto>/app/build/intermediates/ndk/debug/lib/ y
veremos que tenemos las siguientes carpetas y cada una
cuenta con la libreria

Procedimiento Opcion1

Por ltimo aadimos cargamos la libreria en la clase principal, y hacemos uso


del metodo nativo que aadimos al comienzo. Corremos y notaremos que
efectivamente se corrio codigo nativo sobre el dispositivo android.

Procedimiento Opcion1

Ahora si aplicamos el mismo procedimiento del ejemplo pero con el codigo de


openSMILE esto es lo que sucede.

You might also like