Taglib para Android
c android-ndk (5)
Estoy tratando de compilar Taglib
para Android. He descargado la última versión de Taglib
desde here . Después de compilarlo para arm-linux
build, lo he importado correctamente en mi aplicación, pero cuando intento llamar a cualquier función desde tag_c.h
, tag_c.h
siguiente error:
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
La información de configuración de la aplicación es:
Taglib ./configure: -
./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)
Aplicación.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
}
....
....
Versión NDK de Android: - Android-Ndk-r7c
Por favor, guíame en la dirección correcta para arreglar lo que estoy haciendo mal.
Creo que podrías necesitar -ltag_c
en alguna parte
Para hacer el trabajo, hackearía tag_c.h en la línea 43 para definir las reglas de visibility adecuadas:
#define TAGLIB_C_EXPORT __attribute__ ((visibility("default")))
Si esto funciona, puede abrir un error en taglib y vincular nuevamente a esta pregunta.
tag_c.h
vincular tanto tag_c.h
.o como taglibwav.o
:
gcc -o program tag_c.h taglibwav.c
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 razón por la que no puede acceder a taglib_set_strings_unicode
es debido a cómo se define TAGLIB_C_EXPORT en 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);
...
LOCAL_STATIC_LIBRARY := taglibtest
Está utilizando una biblioteca estática, no compartida. La directiva de uso compartido confunde el entorno de compilación.