2013-07-18 11 views
10

Chcę zbudować bibliotekę współdzieloną. Aby go zbudować, muszę zadzwonić do innej udostępnionej biblioteki. Oto co zrobiłem:Jak zbudować bibliotekę współdzieloną i wywołać ją w innym programie NTK

1.Utwórz jeden projekt Androida o nazwie "BuildLib" i dodaj nowy folder "jni" w katalogu projektu. Zawartość folderu JNI:

jni-->Android.mk
-->Application.mk
-->add.cpp
-->add.h add.cpp just do two numbers addition:

add.h:

int add(int a,int b);

add.cpp:

#include "add.h" 
int add(int a,int b){ 
    return a+b;} 

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := add.cpp 
LOCAL_MODULE  := add 
include $(BUILD_SHARED_LIBRARY) 

Po budowania projektu, Mam libadd.so w katalogu $(BUILDLIB)/libs/armeabi/.

Utwórz kolejny projekt Androida o nazwie "CallLib". Skopiuj libadd.so i add.h do folderu jni, utwórz Android.mk, Application.mk i call_add.cpp.

Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
include $(PREBUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_C_INCLUDES := $(LOCAL_PATH) 
LOCAL_SRC_FILES := call_add.cpp 
LOCAL_MODULE  := native 
LOCAL_SHARED_LIBRARIES := add_prebuilt 
include $(BUILD_SHARED_LIBRARY) 

call_add.cpp:

#include "add.h" 
int call_add(){return add(1,2);} 

Wszakże powyżej, buduję projekt CallLib, ale mam błąd:

undefined reference to 'add(int, int)';

myślę libadd.so nie można znaleźć, ale nie wiem, jak to zmienić. Czy ktoś wie, jak mogę to naprawić? Każda pomoc zostanie doceniona.

+0

You używali Eclipse do kompilowania po prawej? Naprawdę utknąłem w Android Studio. Jeśli masz pojęcie o tym, jak to zrobić w Android Studio, daj mi znać. –

+0

pokrewne: https://stackoverflow.com/questions/8358210/how-to-create-a-shared-library-in-android –

Odpowiedz

4

w drugim Android.mk, spróbuj wymienić pierwszy moduł z:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := libadd.so 
LOCAL_MODULE := add_prebuilt 
LOCAL_EXPORT_C_INCLUDES := add.h 
include $(PREBUILD_SHARED_LIBRARY) 

LOCAL_EXPORT_C_INCLUDES flag należy dołączyć informacje nagłówka do modułu add_prebuilt, więc może to być związane z końcowym bibliotece.

+0

Dziękujemy za odpowiedź! Jestem zbyt nieostrożny, powinien to być "PREBUILT_SHARED_LIBRARY", a nie "PREBUILD_SHARED_LIBRARY". Powyższy proces jest absolutnie słuszny, z wyjątkiem tego błędu. – user2591946

1

Tylko w przypadku, ktoś musi go:

Trochę hackish sposobem na utrzymanie łącznika szczęśliwa:

LOCAL_LDLIBS := -llog 

lub

LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -lMyStuff 

Mniej hackish:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := xyz 
LOCAL_SRC_FILES += xyz/xyz.c 
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY) # this builds libxyz.so 


include $(CLEAR_VARS) 
LOCAL_MODULE := abc 
LOCAL_SHARED_LIBRARIES := xyz # <=== !!! this makes libabc.so dependent on libxyz.so 
LOCAL_SRC_FILES := abc/abc.c 
#LOCAL_LDLIBS := ... 
include $(BUILD_SHARED_LIBRARY) # this builds libabc.so 
Powiązane problemy