2013-07-18 17 views
10

Voglio costruire una libreria condivisa. Per costruirlo, ho bisogno di chiamare un'altra libreria condivisa. Ecco quello che ho fatto:Come creare una libreria condivisa e chiamarla in un altro programma ndk

1.Creare un progetto Android, denominato "BuildLib", e aggiungere una nuova cartella "JNI" sotto la directory del progetto. Contenuto della cartella 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) 

Dopo genera il progetto, Ho ottenuto libadd.so nella directory $(BUILDLIB)/libs/armeabi/.

Creare un altro progetto Android, denominato "CallLib". Copiare libadd.so e add.h cartella JNI, creare Android.mk, Application.mk e 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);} 

Dopo tutto sopra, genera il progetto CallLib, ma ottenuto l'errore:

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

penso il libadd.so non può essere trovato, ma non so come modificare. Qualcuno sa come posso risolvere questo? Qualsiasi aiuto sarà apprezzato.

+0

È stavano usando Eclipse per la compilazione giusta ??? Sono davvero bloccato con questo in Android Studio. Se hai qualche idea su come farlo in Android Studio, fammelo sapere. –

+0

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

risposta

4

Nel tuo secondo Android.mk, provare a sostituire il primo modulo con:

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) 

La bandiera LOCAL_EXPORT_C_INCLUDES dovrebbe collegare le informazioni di intestazione al modulo add_prebuilt, in modo che possono essere collegati con la libreria finale.

+0

Grazie per la risposta! Sono troppo distratto, E 'dovrebbe essere "PREBUILT_SHARED_LIBRARY" non processo "PREBUILD_SHARED_LIBRARY" .La sopra è giusto assolutamente, tranne questo errore. – user2591946

1

Solo nel caso qualcuno ne ha bisogno:

Un modo hackish po 'per mantenere il linker felice:

LOCAL_LDLIBS := -llog 

o

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

Meno hacker:

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 
Problemi correlati