Taglib para Android
Estoy tratando de compilar Taglib
para Android. He descargado la última versión de Taglib
desde aquí . Después de compilarlo para arm-linux
construir he importado con éxito en mi aplicación, pero cuando intento llamar a cualquier función de tag_c.h
estoy recibiendo error siguiente:
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:
- Gradle experimental incluir directorios de archivos a través de la directiva srcDir srcFile
- ¿Cómo puedo crear una biblioteca compartida en C ++ para Android e iOS?
- Se produjo un error al agregar a la tabla ref de matrices JNI fijada (1024 entradas)
- Aprendiendo C / C ++ y Java
- Googletest para Android NDK
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)
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 Versión: – Android-Ndk-r7c
Por favor, guíame en la dirección correcta para arreglar lo que estoy haciendo mal
- Utilizar C ++ con Android ndk / jni
- Llame a la biblioteca C ++ de Java en Android
- Integración de jpct-ae con el motor Vuforia de Qualcomm en android
- OpenGL ES - glReadPixels
- Mat to Bitmap en el archivo jni cpp de Android
- Android NDK limitaciones?
- Camino de directorio de DCIM en Android - Valor de retorno
- Alineación de la memoria en iPhone y Android
Creo que necesitará -ltag_c
en algún lugar
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 se 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); ...
Para hacer el trabajo haría un tag_c.h en la línea 43 para definir las reglas de visibilidad apropiadas:
#define TAGLIB_C_EXPORT __attribute__ ((visibility("default")))
Si esto funciona, puede abrir un error en taglib y vincularlo de nuevo a esta pregunta.
LOCAL_STATIC_LIBRARY := taglibtest
Está utilizando biblioteca estática, no compartida. La directiva de utilizar compartida confunde el entorno de compilación.
Necesitas enlazar tanto tag_c.h
.o como taglibwav.o
:
gcc -o program tag_c.h taglibwav.c