【问题标题】:Taglib for Android安卓标签库
【发布时间】:2013-03-31 01:13:02
【问题描述】:

我正在尝试为 Android 编译 Taglib。我已经下载了最新版本 Taglib 来自 here 。在为arm-linux build 编译后,我已成功将其导入到我的应用程序中,但是当我尝试从tag_c.h 调用任何函数时,出现以下错误:

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

应用配置信息为:

标签库 ./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 版本:- Android-Ndk-r7c

请指导我正确的方向来解决我做错的事情

【问题讨论】:

  • 我没用过TagLib,所以不知道能不能帮忙。 :( 错误是什么?
  • @Sam:从 tag_c.h 访问任何函数时,我收到 undefined reference to taglib_set_strings_unicode 错误。当我在 Ubuntu 上使用 gcc 编译它时,您可以看到 this example 从任何运行完美的音频文件中读取所有标签。
  • @ρяσѕρєяK 几个月来,我一直在努力研究如何在 Android 上使用 taglib。如果您对此有任何运气,我很乐意就此进行简短讨论.. t.malseed@gmail.com -- 感谢您的宝贵时间。
  • 你有没有发现这个@ρяσѕρєяK?我现在正在遇到一模一样的问题! :(

标签: android c android-ndk taglib


【解决方案1】:

您需要同时链接tag_c.h.o 和taglibwav.o

gcc -o program tag_c.h taglibwav.c

【讨论】:

    【解决方案2】:
    LOCAL_STATIC_LIBRARY := taglibtest
    

    您使用的是静态库,而不是共享库。使用 shared 的指令会混淆构建环境。

    【讨论】:

      【解决方案3】:

      为了完成工作,我会修改 tag_c.h at line 43 来定义正确的 visibility 规则:

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

      如果可行,您可以open a bug at taglib 并链接回此问题。

      【讨论】:

        【解决方案4】:
          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
        

        你无法访问taglib_set_strings_unicode的原因是因为TAGLIB_C_EXPORT在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);
        ...
        

        【讨论】:

        【解决方案5】:

        我想你可能需要-ltag_c 在某个地方

        【讨论】:

        • 感谢您的回复。我在哪里添加-ltag?我用LOCAL_LDLIBS 尝试过,但我得到/arm-linux-androideabi/bin/ld: cannot find -ltag
        • 哎呀...应该是-ltag_c,您可能需要将库复制或链接到该路径
        • 谢谢,你可以看到我的taglibwav.c,我可以从tag_c.h 访问TagLib_FileTagLib_TagTagLib_AudioProperties 结构,但是当访问任何方法时,我都会遇到同样的错误。
        • 我想那是因为这是一个链接器错误。结构体在标头中定义,但仅在其中定义函数的原型。
        • 如果您的链接器显示“找不到 -lany-library”,请将 -Lpath/to/the/library 添加到 LOCAL_LDLIBS 变量中。
        猜你喜欢
        • 1970-01-01
        • 2013-07-02
        • 2011-05-07
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多