2010-12-30 16 views
7

Buduję apk Androida, który korzysta z niektórych bibliotek natywnych stron trzecich, te biblioteki znajdują się w bibliotece kodów obiektów statycznych (pliki .a) i muszę napisać dokument JNI otoki, aby uzyskać dostęp do tych funkcji w Javie.Łączenie bibliotek stron trzecich (libs.a) z NDK

Te biblioteki są już skompilowane z kompilatorem krzyżowym i są przeznaczone bezpośrednio na system Android.

Jak skompilować moje źródła JNI, łącząc się z funkcjami w plikach .a libs?

To mój 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) 

Kiedy skompilować, otrzymuję tylko plik native.c skompilowany.

Odpowiedz

10

Aby to zrobić.

Muszę zadeklarować te biblioteki jako moduły. Podobnie jak następujące.

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) 

Z pliku libcurl.a w tym samym folderze co tego pliku Android.mk i/include fodler z nagłówków.

Teraz w głównym module zadeklaruj lib, a Android NDK zajmie się resztą.

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) 

Uwaga: przed użyciem należy załączyć plik modułu Android.mk. Robię to za pomocą wywołania all-subdir-makefiles.

+2

Działa również z bibliotekami współużytkowanymi (* .so). Na przykład po prostu "adb pull /system/lib/libsqlite.so", aby połączyć z sqlite. –

+0

Próbuję różnych sposobów, ale nie mogę znaleźć odpowiedzi, proszę o pomoc http://stackoverflow.com/questions/7332679/cant-create-shared-library-with-static-inside –

+0

@Marcos pierwszy to osobny plik Makefile? jeśli tak, to gdzie musisz go dodać i nie widzę anylinka do pierwszego makefile w drugiej części? – jxgn

1

Twoje libs muszą być skompilowane dla twojego konkretnego celu (Arm), aby to zrobić Myślę, że musisz użyć toolchain, jak opisano w dokumentacji/STANDALONE-TOOLCHAIN.html (w twoim folderze ndk-r5).

+2

Biblioteki są już skompilowane do określonego ramienia przy użyciu narzędzi krzyżowych kompilatora. –

Powiązane problemy