2010-12-30 21 views
7

Sto creando un apk Android che utilizza alcune librerie native di terze parti, queste librerie sono in libreria codici oggetti statici (file .a) e devo scrivere un JNI wrapper per accedere in Java a queste funzioni.Collegamento di librerie di terze parti (libs.a) con NDK

Queste librerie sono già compilate con un cross-compilatore e sono native di Android.

Come si compilano le origini JNI collegate alle funzioni nei file .a libs?

Questo è il mio 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) 

Quando compilo, ottengo solo il file native.c compilato.

risposta

10

Per farlo.

Devo dichiarare queste librerie come moduli. Mi piace il seguente.

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 file libcurl.a nella stessa cartella di questo file Android.mk, e un/include fodler con le intestazioni.

Ora nel modulo principale è sufficiente dichiarare la lib e Android NDK si prenderà cura di tutto il 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 .. è necessario includere il file Android.mk del modulo prima di utilizzarlo. Lo faccio con la chiamata all-subdir-makefiles.

+2

Funziona anche con le librerie condivise (* .so). Ad esempio, mi basta "adb pull /system/lib/libsqlite.so" per collegarsi a sqlite. –

+0

Provo diversi modi ma non riesco a trovare una risposta per favore aiuto http://stackoverflow.com/questions/7332679/cant-create-shared-library-with-static-inside –

+0

@Marcos il primo è un makefile separato ?? se è così dove devi aggiungerlo e non vedo alcun collegamento al primo makefile nella seconda parte ?? – jxgn

1

Le tue librerie devono essere compilate per il tuo target specifico (Arm), per farlo penso che devi usare la toolchain come descritto in docs/STANDALONE-TOOLCHAIN.html (nella tua cartella ndk-r5).

+2

Le librerie sono già compilate per il braccio specifico utilizzando i toolchain del compilatore incrociato. –

Problemi correlati