2010-12-30 10 views
7

Estoy compilando una apk de Android que usa algunas bibliotecas nativas de un tercero, estas bibliotecas están en la Biblioteca de códigos de objetos estáticos (archivos .a) y necesito escribir una JNI envoltorio para acceder en Java a estas funciones.Vinculación de libs de terceros (libs.a) con NDK

Esas bibliotecas ya están compiladas con un compilador cruzado y son nativas de Android.

¿Cómo compilo mis fuentes JNI vinculadas a las funciones en los archivos .a libs?

Esta es mi Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_LDLIBS := -llog 

LOCAL_MODULE := ndk1 
LOCAL_SRC_FILES := native.c 

include $(BUILD_SHARED_LIBRARY) 

Cuando compilo, me sale sólo el archivo native.c compilado.

Respuesta

10

Para hacer eso.

Tengo que declarar estas bibliotecas como módulos. Como el siguiente.

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := curl 
LOCAL_SRC_FILES := libcurl.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 

include $(PREBUILT_STATIC_LIBRARY) 

Con un archivo libcurl.a en la misma carpeta que el archivo Android.mk, y/fodler incluyen las cabeceras.

Ahora, en el módulo principal, solo declare la lib y el NDK de Android se encargará del resto.

LOCAL_PATH := $(call my-dir) 

include $(call all-subdir-makefiles) 
include $(CLEAR_VARS) 

LOCAL_LDLIBS := -llog -ldl 
LOCAL_MODULE := rmsdk 
LOCAL_SRC_FILES := curlnetprovider.cpp native.c 
LOCAL_STATIC_LIBRARIES := curl 

include $(BUILD_SHARED_LIBRARY) 

Nota ... debe incluir el archivo Android.mk del módulo antes de usarlo. Lo hago con la llamada all-subdir-makefiles.

+2

También funciona con bibliotecas compartidas (* .so). Por ejemplo, simplemente "adb pull /system/lib/libsqlite.so" para enlazar con sqlite. –

+0

Probé de diferentes maneras, pero no puedo encontrar la respuesta, por favor ayuda http://stackoverflow.com/questions/7332679/cant-create-shared-library-with-static-inside –

+0

@Marcos el primero es un archivo MAKE separado? si es así, ¿dónde debes agregarlo y no veo ningún enlace al primer archivo MAKE en la segunda parte? – jxgn

1

Debes compilar tus libs para tu objetivo específico (Arm), para hacer eso creo que tienes que usar la toolchain como se describe en docs/STANDALONE-TOOLCHAIN.html (en tu carpeta ndk-r5).

+2

Las bibliotecas ya están compiladas en el brazo específico utilizando cadenas de herramientas de compilador cruzado. –

Cuestiones relacionadas