2011-08-03 6 views
3

Je suis confronté à un problème et j'aimerais savoir pourquoi cela se produit.Problème lors de la compilation du code android-ndk

J'ai un projet qui se compose d'un fichier Java et de quelques fichiers de code JNI & C++. Je construis le code JNI and C++ par cygwin qui fait partie de android ndk-tools. Ci-dessous mon fichier Android.mk

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := cube 
LOCAL_CFLAGS := -DANDROID_NDK 
LOCAL_SRC_FILES := Testing.cpp 
LOCAL_LDLIBS := -lGLESv1_CM 
include $(BUILD_SHARED_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE := jni_opengl 
LOCAL_SRC_FILES := jni_openglcube.cpp 
LOCAL_SHARED_LIBRARIES := cube 
include $(BUILD_SHARED_LIBRARY) 

Dans le module script ci-dessus cube est écrit dans la norme C++ qui font des choses opengl et jni_opengl est écrit en JNI. Au-dessus du script se compile bien mais quand je change la ligne 8 include $(BUILD_SHARED_LIBRARY) à include $(BUILD_STATIC_LIBRARY) Je commence à recevoir l'erreur concernant des méthodes opengl non trouvées dans Testing.cpp.

Ma question est pourquoi dans le cas de shared library, android peut trouver les références de opengl méthode liée et pourquoi pas quand je le change en static library?

Répondre

0

Les symboles nécessaires dans les bibliothèques partagées sont parfois recherchés au moment de l'exécution. Donc, je pense que vous rencontrez le même problème, mais maintenant, au moment de l'exécution, pas le temps de liaison. Voir si le code avec la bibliothèque partagée s'exécute.

0

Je ne pense pas que vous devez avoir:

LOCAL_LDLIBS := -lGLESv1_CM 

pour votre bibliothèque statique.

Vous devrez le déplacer dans votre section de bibliothèque partagée. La section statique ira bien sans elle.

Ne pas oublier de changer:

LOCAL_SHARED_LIBRARIES := cube 

à

LOCAL_STATIC_LIBRARIES := cube 

Une bibliothèque statique est juste un tas de fichiers .o jointes ensemble, il ne soit pas « lié » dans de la même manière qu'une bibliothèque partagée.

Votre dernière Android.mk devrait ressembler à ceci:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libcube 
LOCAL_CFLAGS := -DANDROID_NDK 
LOCAL_SRC_FILES := Testing.cpp 
include $(BUILD_STATIC_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_MODULE := jni_opengl 
LOCAL_SRC_FILES := jni_openglcube.cpp 
LOCAL_STATIC_LIBRARIES := libcube 
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog 
include $(BUILD_SHARED_LIBRARY) 
Questions connexes