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:
- Archivo de serialización en Android
- ¿Cómo bloquear mediante programación la pantalla en Android?
- Cómo implementar XMPP para enviar notificaciones push
- Android: obtener error cerca de runOnUiThread cuando lo uso cerca de fragmento
- Java enum ¿Puedo agregar un método de devolución?
- Cree una aplicación estándar de Android utilizando Android Studio.
- 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.
- Descargue las fuentes live555 de http://www.live555.com/liveMedia/public/ seleccionando el archivo live555-latest.tar.gz.
- 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. -
Dentro de la carpeta
jni
anterior, cree los archivosAndroid.mk
yApplication.mk
. El archivoApplication.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)
-
En mi archivo
$PROJECT_DIR\gradle.properties
, he incluido la líneaandroid.useDeprecatedNdk=true
-
En
$PROJECT_DIR\local.properties
, tengo:ndk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\ndk sdk.dir=C\:\\Users\\user\\AppData\\Local\\Android\\sdk
-
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' }
-
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
?
- Android y GSON lanzando No-Args Constructor no encontrado excepción
- Añadir acceso directo a la aplicación de Android En la pantalla principal, haga clic en el botón
- Anotación @Override en Android
- Mi compilación falla cuando uso Ant para construir y el proyecto de Android con múltiples bibliotecas
- Evitar que RecyclerView muestre contenido anterior al desplazarse
- LibGDX: Crear una rejilla para el juego de mesa
- Lista de desplazamiento infinito de Android en ambas direcciones
- ¿Cuáles son las unidades de temperatura y voltaje de la batería cuando Intent.BATTERY_ACTION_CHANGED en el dispositivo android?
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)
- ¿Cómo determino qué triángulo tocó el usuario en este rectángulo?
- Android: Cómo poner elementos personalizados en un círculo / destino