Cómo utilizar la biblioteca compartida .so en Java Android Studio Project

He estado trabajando en este problema durante los últimos dos días. Estoy tratando de usar live555 ( http://www.live555.com/ ), un servidor de streaming media C / C ++, como una biblioteca en un proyecto Java Android Studio. He podido usar ndk-build para crear un conjunto de archivos .so, pero no puedo encontrar ninguna documentación sobre cómo utilizar ahora la biblioteca dentro de mi aplicación Java. Aquí está mi configuración:

  • Windows 8.1 de 64 bits
  • Oracle JDK 1.8
  • Android Studio 1.5.1
  • Gradle 1.5.0
  • Herramientas de compilación 23.0.2

Pasos para llegar a donde estoy hasta ahora:

  1. Cree una aplicación estándar de Android utilizando Android Studio.
  2. Haga clic con el botón derecho en el módulo de la aplicación en el explorador de proyectos y seleccione Nuevo | Carpeta | JNI desde el menú contextual.
  3. Descargue las fuentes live555 de http://www.live555.com/liveMedia/public/ seleccionando el archivo live555-latest.tar.gz.
  4. Extraer las fuentes de la carpeta JNI, de modo que ahora tiene una estructura de carpetas como:
    $ PROJECT_DIR
    |
    | – | –src
    | – | – | –main
    Unesdoc.unesco.org unesdoc.unesco.org
    Yo vivo
    Donde la carpeta live contiene las fuentes live555.
  5. Dentro de la carpeta jni anterior, cree los archivos Android.mk y Application.mk . El archivo Application.mk contiene:

     APP_OPTM := release APP_ABI := armeabi armeabi-v7a APP_PLATFORM := android-21 APP_STL := stlport_shared 

    El archivo Android.mk contiene:

     LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 LOCAL_SRC_FILES := \ live\BasicUsageEnvironment\BasicHashTable.cpp \ live\BasicUsageEnvironment\BasicTaskScheduler0.cpp \ ...All of the rest of the .c and .cpp files LOCAL_C_INCLUDES := \ $(LOCAL_PATH)\live \ $(LOCAL_PATH)\live\BasicUsageEnvironment\include \ $(LOCAL_PATH)\live\BasicUsageEnvironment \ $(LOCAL_PATH)\live\UsageEnvironment\include \ $(LOCAL_PATH)\live\UsageEnvironment \ $(LOCAL_PATH)\live\groupsock\include \ $(LOCAL_PATH)\live\groupsock \ $(LOCAL_PATH)\live\liveMedia\include \ $(LOCAL_PATH)\live\liveMedia \ LOCAL_CPPFLAGS += -fPIC -fexceptions -DXLOCALE_NOT_USED=1 -DNULL=0 -DNO_SSTREAM=1 -UIP_ADD_SOURCE_MEMBERSHIP include $(BUILD_SHARED_LIBRARY) 
  6. En mi archivo $PROJECT_DIR\gradle.properties , he incluido la línea android.useDeprecatedNdk=true

  7. En $PROJECT_DIR\local.properties , tengo:

     ndk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\ndk sdk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\sdk 
  8. En mi archivo $PROJECT_DIR\app\build.gradle tengo:

     apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.company.android.myapp" minSdkVersion 21 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk { moduleName "live555" } sourceSets.main { jni.srcDirs = [] jniLibs.srcDir "src\\main\\libs" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' } 
  9. Luego ejecuto ndk-build en la carpeta $PROJECT_DIR\app\src\main\jni .

El ndk-build da como resultado la siguiente estructura de carpeta / salida de archivo:
$ PROJECT_DIR
|
| – | –src
| – | – | –main
| – | – | – | –libs
| – |
| – | – | – | – | – | –liblive555.so
Unesdoc.unesco.org unesdoc.unesco.org
| – | – | –armeable-v7a
| – | – | – | – | – | –liblive555.so
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org
| – | – | – | – | – | –arme
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org
| – | – | – |
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org
Unesdoc.unesco.org unesdoc.unesco.org

Cuando construyo el proyecto desde la ventana Build | Hacer opción de menú Proyecto, Tengo una estructura de proyecto en la vista de Android que se parece a:
App
| –Estudios
| –java
| –Libros
| –Diario
| – | – | –liblive555.so
| – | – | –libstlport_shared.so
| – | –armeable-v7a
| – | – | –liblive555.so
| – | – | –libstlport_shared.so
| –res

He añadido un archivo Live555Ndk.java a mi proyecto desde el cual empezar a referenciar la biblioteca live555. Contiene:

 package com.company.android.myapp; public class Live555Ndk { static { System.loadLibrary("live555"); } } 

Sin embargo, no sé cómo comenzar a crear instancias de objeto y métodos de llamada en la biblioteca live555 ahora que tengo los objetos compartidos. ¿Puede alguien señalarme en la dirección correcta?

Gracias por cualquier información.

ACTUALIZACIÓN 15/02/2016

OK, he eliminado el bloque ndk {} de mi archivo app \ build.gradle basado en el siguiente aviso de mcwise.

Creo que he envuelto mi mente alrededor de cómo esto funciona ahora, pero todavía no puedo referirme a la biblioteca live555. Empecé un nuevo proyecto de Android con una sola actividad y el archivo de diseño correspondiente. jniLibs una carpeta jniLibs y copié en los archivos armeabi \ liblive555.so etc en esa carpeta. He añadido en el archivo Live555Ndk.java que mencioné anteriormente con el constructor estático y la llamada a SystemloadLibrary("live555"); . También agregué una llamada al public native boolean isThisMediaSession(); . Entonces utilicé javah para generar un archivo de cabecera dentro de una carpeta jni . A continuación, creé el archivo .cpp correspondiente para crear la implementación del método. Sin embargo, no puedo incluir ningún archivo de encabezado de liblive555.so. Es como Android Studio ni siquiera es consciente de la existencia de la biblioteca live555. Por lo tanto, no puedo tener una línea como #include <live555/MediaSession.hh> . ¿Me falta un paso adicional? Este proyecto de Android solo tiene los archivos .so, no las fuentes. ¿Necesito agregar las fuentes live555 a la carpeta jni ?

Echa un vistazo a las numerosas muestras de Android NDK desarrolladas por Google. Puedes encontrarlos aquí .

El ejemplo hello-gl2 es un buen punto de partida.

Gl_code.cpp muestra cómo crear código JNI que se puede llamar desde Java. Preste especial atención a esta parte del código, que define dos métodos y los hace visibles para la capa de Java:

 extern "C" { JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj, jint width, jint height); JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj); }; JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj, jint width, jint height) { setupGraphics(width, height); } JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj) { renderFrame(); } 

GL2JNILib.java muestra cómo llamar a los métodos definidos en gl_code.cpp desde Java.

 public class GL2JNILib { static { System.loadLibrary("gl2jni"); } /** * @param width the current view width * @param height the current view height */ public static native void init(int width, int height); public static native void step(); } 

ACTUALIZAR:

Para crear un módulo C ++ que dependa de la biblioteca live555, deberá agregar la siguiente sección a Android.mk:

 include $(CLEAR_VARS) LOCAL_MODULE := your_module LOCAL_SRC_FILES := your_module_file.cpp LOCAL_SHARED_LIBRARIES := live555 include $(BUILD_SHARED_LIBRARY) 

Consulte esta documentación para referencia:

  • Android.mk (LOCAL_SHARED_LIBRARIES)
  • Uso de bibliotecas pre-construidas (la sintaxis es la misma para los módulos posteriores)
  • Error con Maven Android: El POM para com.google.android.gms: google-play-services: jar: 13.0.0 falta, no hay información de dependencia disponible
  • Flickr Oauth Conectarse con Scribe Library
  • URL - FileNotFoundException para archivo de imagen en Android
  • RxJava 2.x: ¿Debo usar Flowable o Single / Completable?
  • Cómo hacer copias de seguridad de los contactos o sms en la tarjeta SD como archivo .xml o .csv y restaurarlos más tarde
  • Necesita guardar una puntuación alta para un juego de Android
  • Cómo leer / analizar el contenido del artículo de un enlace a una cadena
  • Eclipse 3.6 frecuentemente se bloquea durante Content Assist
  • Android restlet añadir no estándar de encabezado param
  • IntelliJ y Android Dependencias de Gradle - no puede encontrar el módulo
  • Android Studio org.slf4j.spi.LocationAwareLogger.log
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.