Taglib pour Android

J'essaie de compiler Taglib pour Android. J'ai téléchargé la dernière version de Taglib à partir de ici . Après avoir compilé pour arm-linux construire je l'ai importé dans mon application, mais quand j'essaie d'appeler n'importe quelle fonction à partir de tag_c.h, j'obtiens l'erreur suivante:

SharedLibrary  : taglibwav.so
/home/test/workspacenew/Androidtaglibexample/obj/local/armeabi/
objs/squared/taglibwav.o: In function 
`Java_com_android_androidtag_WavFileDetails_taglibwav':
/home/test/workspacenew/Androidtaglibexample/jni/taglibwav.c:30: 
undefined reference to `taglib_set_strings_unicode'
collect2: ld returned 1 exit status
make: *** [/home/test/workspacenew/Androidtaglibexample/obj/
local/armeabi/taglibwav.so] Error 1

Les informations de configuration de L'Application sont:

Taglib ./configurer :-

./configure CC="/home/hcl/taglib/taglib/toolchain/bin/arm-linux-androideabi-gcc"
--host="arm-linux" 
--build="arm" 
--enable-static="no" 
--enable-shared="yes" 
--prefix="/home/test/workspacenew/Androidtaglibexample/jni/testtaglib/"

Android.mk :-

LOCAL_PATH := $(call my-dir)

#declare the prebuilt library
include $(CLEAR_VARS)
LOCAL_MODULE := taglibtest
LOCAL_SRC_FILES := testtaglib/lib/libtag.a
LOCAL_EXPORT_C_INCLUDES := testtaglib/include/taglib/
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS) 
include $(call all-subdir-makefiles)
LOCAL_MODULE := taglibwav
LOCAL_SRC_FILES := taglibwav.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/testtaglib/include/taglib/
LOCAL_SHARED_LIBRARY := taglibtest
LOCAL_LDLIBS    := -llog -ljnigraphics -lz -lm -L$(SYSROOT)/usr/lib -llog 
include $(BUILD_SHARED_LIBRARY)


Application.mk :-
APP_ABI :=armeabi
APP_STL:=stlport_static


taglibwav.c: -
#include <jni.h>
#include <tag_c.h>
#include <android/log.h>
#ifndef FALSE
#define FALSE 0
#endif
.......
.......
JNIEXPORT void JNICALL Java_com_android_androidtag_WavFileDetails_taglibwav
  (JNIEnv * ev, jclass jc){
      int i;
      int seconds;
      int minutes;
      TagLib_File *file;  //<< accessed form tag_c.h : OK
      TagLib_Tag *tag;    //<< accessed form tag_c.h : OK
      const TagLib_AudioProperties *properties; //<<accessed form tag_c.h : OK
      taglib_set_strings_unicode(FALSE);//<<accessed form tag_c.h : GETTING ERROR
}
....
....

Android NDK Version: - Android-Ndk-r7c

S'il vous plait, guidez-moi dans la bonne direction pour réparer ce que je fais mal

21
demandé sur ρяσѕρєя K 2013-04-08 23:58:55

5 réponses

Je pense que vous pourriez avoir besoin -ltag_c, quelque part

9
répondu Merlin 2013-04-08 21:16:06
  TagLib_File *file;  //<< accessed form tag_c.h : OK
  TagLib_Tag *tag;    //<< accessed form tag_c.h : OK
  const TagLib_AudioProperties *properties; //<<accessed form tag_c.h : OK
  taglib_set_strings_unicode(FALSE);//<<accessed form tag_c.h : GETTING ERROR

La raison pour laquelle vous ne pouvez pas accéder à taglib_set_strings_unicode est la façon dont TAGLIB_C_EXPORT est défini dans tag_c. h.

#if defined(_WIN32) || defined(_WIN64)
#ifdef MAKE_TAGLIB_C_LIB
#define TAGLIB_C_EXPORT __declspec(dllexport)
#else
#define TAGLIB_C_EXPORT __declspec(dllimport)
#endif
#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1)
#define TAGLIB_C_EXPORT __attribute__ ((visibility("default")))
#else
#define TAGLIB_C_EXPORT
#endif
...
typedef struct { int dummy; } TagLib_File;
typedef struct { int dummy; } TagLib_Tag;
typedef struct { int dummy; } TagLib_AudioProperties;
...
TAGLIB_C_EXPORT void taglib_set_strings_unicode(BOOL unicode);
...
1
répondu Duke 2013-04-10 01:13:36

Pour faire le travail, je piraterais tag_c. h à la ligne 43 pour définir les règles visibility appropriées:

#define TAGLIB_C_EXPORT __attribute__ ((visibility("default")))

Si cela fonctionne, vous pouvez ouvrir un bug sur taglib et renvoyer à cette question.

0
répondu Giacomo Tesio 2013-04-15 10:56:15
LOCAL_STATIC_LIBRARY := taglibtest

Vous utilisez une bibliothèque statique, non partagée. La directive d'utiliser shared one confond l'environnement de construction.

0
répondu Valeri Atamaniouk 2013-04-15 21:50:59

Vous devez lier les deux tag_c.h.o et taglibwav.o :

gcc -o program tag_c.h taglibwav.c
0
répondu dharam 2013-04-18 10:51:40