0

我正在尝试使用 NDK 将 TagLib C++ 库 ( http://taglib.github.io/ ) 导入 Android。

/jni/taglibroot/通过将所有源代码放在下面的图片中,我能够成功编译库:

在此处输入图像描述

ndk-build/jni文件夹上运行。

但是,我还创建了tag_lib_personal.cpp下面的文件(使用 TagLib API):

#include <jni.h>
/*#include <iostream>
#include <iomanip>*/
#include <stdio.h>

#include <taglibroot/taglib/fileref.h>
#include <taglibroot/taglib/tag.h>
#include <taglibroot/taglib/tpropertymap.h>


#ifdef __cplusplus
extern "C"
{
#endif

    jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {

      TagLib::FileRef f(argv[i]);

      if(!f.isNull() && f.audioProperties()) {

        TagLib::AudioProperties *properties = f.audioProperties();

        int seconds = properties->length() % 60;
        int minutes = (properties->length() - seconds) / 60;

        /*cout << "-- AUDIO --" << endl;
        cout << "bitrate     - " << properties->bitrate() << endl;
        cout << "sample rate - " << properties->sampleRate() << endl;
        cout << "channels    - " << properties->channels() << endl;
        cout << "length      - " << minutes << ":" << formatSeconds(seconds) << endl;*/
      }

      return "hello world!";

      //return (*env)->NewStringUTF(env, "Hello from native code!");
}

#ifdef __cplusplus
}
#endif

但我无法编译它。当我尝试ndk-build再次运行时,出现以下错误:

[armeabi] Compile++ arm  : my_own_source_files <= tag_lib_personal.cpp
In file included from D:/blabla/eclipse-jee-indigo-SR2-win32-x86_64/workspace/Project//jni/tag_lib_personal.cpp:7:0:
D:/blabla/eclipse-jee-indigo-SR2-win32-x86_64/workspace/Project//jni/taglibroot/taglib/fileref.h:29:19: fatal error: tfile.h: No such file or directory
compilation terminated.
make.exe: *** [D:/blabla/eclipse-jee-indigo-SR2-win32-x86_64/workspace/Project//obj/local/armeabi/objs/my_own_source_files/tag_lib_personal.o] Error 1

该错误表明它无法从 TagLib 库中找到一些 .h 文件。这是我的Android.mk文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := taglib_module
FILE_LIST := $(wildcard $(LOCAL_PATH)/taglibroot/*.cpp) #Based on: http://stackoverflow.com/a/8980441
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)


LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/foo
LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog

LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)
# If I run ndk-build only on the above code, it compiles the TagLib library successfully and generates the .so files as expected


include $(CLEAR_VARS)
LOCAL_MODULE := my_own_source_files
LOCAL_SHARED_LIBRARIES := taglib_module
LOCAL_SRC_FILES := tag_lib_personal.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/taglibroot/taglib,\
                    $(LOCAL_PATH)/taglibroot/taglib/ape,\
                    $(LOCAL_PATH)/taglibroot/taglib/asf,\
                    $(LOCAL_PATH)/taglibroot/taglib/flac,\
                    $(LOCAL_PATH)/taglibroot/taglib/it,\
                    $(LOCAL_PATH)/taglibroot/taglib/mod,\
                    $(LOCAL_PATH)/taglibroot/taglib/mp4,\
                    $(LOCAL_PATH)/taglibroot/taglib/mpc,\
                    $(LOCAL_PATH)/taglibroot/taglib/mpeg,\
                    $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v1,\
                    $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v2,\
                    $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v2/frames,\
                    $(LOCAL_PATH)/taglibroot/taglib/ogg,\
                    $(LOCAL_PATH)/taglibroot/taglib/ogg/flac,\
                    $(LOCAL_PATH)/taglibroot/taglib/ogg/opus,\
                    $(LOCAL_PATH)/taglibroot/taglib/ogg/speex,\
                    $(LOCAL_PATH)/taglibroot/taglib/ogg/vorbis,\
                    $(LOCAL_PATH)/taglibroot/taglib/riff,\
                    $(LOCAL_PATH)/taglibroot/taglib/riff/aiff,\
                    $(LOCAL_PATH)/taglibroot/taglib/riff/wav,\
                    $(LOCAL_PATH)/taglibroot/taglib/s3m,\
                    $(LOCAL_PATH)/taglibroot/taglib/toolkit,\
                    $(LOCAL_PATH)/taglibroot/taglib/trueaudio,\
                    $(LOCAL_PATH)/taglibroot/taglib/wavpack,\
                    $(LOCAL_PATH)/taglibroot/taglib/xm

LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)

如您所见,我将 TagLib 库的每个目录都放在了LOCAL_EXPORT_C_INCLUDES指令中,其中至少有一个 .h 文件,但由于某种原因它仍然找不到tfile.h(在里面$(LOCAL_PATH)/taglibroot/taglib/toolkit)。我错过了什么?

4

1 回答 1

1

你没有错过,你有一个额外的;-)

语法 forLOCAL_C_INCLUDES不需要这些逗号。您只需列出所有目录。实际上,您可以LOCAL_EXPORT_C_INCLUDES改用(您可能尝试过的帖子提示):

LOCAL_C_INCLUDES := $(LOCAL_PATH)/taglibroot/taglib\
                $(LOCAL_PATH)/taglibroot/taglib/ape\
                $(LOCAL_PATH)/taglibroot/taglib/asf\
                $(LOCAL_PATH)/taglibroot/taglib/flac\
                $(LOCAL_PATH)/taglibroot/taglib/it\
                $(LOCAL_PATH)/taglibroot/taglib/mod\
                $(LOCAL_PATH)/taglibroot/taglib/mp4\
                $(LOCAL_PATH)/taglibroot/taglib/mpc\
                $(LOCAL_PATH)/taglibroot/taglib/mpeg\
                $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v1\
                $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v2\
                $(LOCAL_PATH)/taglibroot/taglib/mpeg/id3v2/frames\
                $(LOCAL_PATH)/taglibroot/taglib/ogg\
                $(LOCAL_PATH)/taglibroot/taglib/ogg/flac\
                $(LOCAL_PATH)/taglibroot/taglib/ogg/opus\
                $(LOCAL_PATH)/taglibroot/taglib/ogg/speex\
                $(LOCAL_PATH)/taglibroot/taglib/ogg/vorbis\
                $(LOCAL_PATH)/taglibroot/taglib/riff\
                $(LOCAL_PATH)/taglibroot/taglib/riff/aiff\
                $(LOCAL_PATH)/taglibroot/taglib/riff/wav\
                $(LOCAL_PATH)/taglibroot/taglib/s3m\
                $(LOCAL_PATH)/taglibroot/taglib/toolkit\
                $(LOCAL_PATH)/taglibroot/taglib/trueaudio\
                $(LOCAL_PATH)/taglibroot/taglib/wavpack\
                $(LOCAL_PATH)/taglibroot/taglib/xm

注意如果你以后遇到奇怪ndk-build的问题,首先建议运行ndk-build V=1:它会记录所有实际使用的编译命令ndk-build,这可能经常暴露各种Android.mk文件中的错误或拼写错误。

PS您的构建最终将失败。在构建 taglib 时,您还需要编译子目录中的所有.cpp文件!taglibroot我建议您尝试使用CMake以设计构建的方式构建库。Android 补丁可以在这里找到:https ://code.google.com/p/android-cmake 。

您也可以尝试一种简单的方法,但我不确定它是否有效:

MY_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := taglib_module
LOCAL_PATH := $(MY_PATH)/taglibroot/taglib
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)\
        $(LOCAL_PATH)/ape\
        $(LOCAL_PATH)/asf\
        $(LOCAL_PATH)/flac\
        $(LOCAL_PATH)/it\
        $(LOCAL_PATH)/mod\
        $(LOCAL_PATH)/mp4\
        $(LOCAL_PATH)/mpc\
        $(LOCAL_PATH)/mpeg\
        $(LOCAL_PATH)/mpeg/id3v1\
        $(LOCAL_PATH)/mpeg/id3v2\
        $(LOCAL_PATH)/mpeg/id3v2/frames\
        $(LOCAL_PATH)/ogg\
        $(LOCAL_PATH)/ogg/flac\
        $(LOCAL_PATH)/ogg/opus\
        $(LOCAL_PATH)/ogg/speex\
        $(LOCAL_PATH)/ogg/vorbis\
        $(LOCAL_PATH)/riff\
        $(LOCAL_PATH)/riff/aiff\
        $(LOCAL_PATH)/riff/wav\
        $(LOCAL_PATH)/s3m\
        $(LOCAL_PATH)/toolkit\
        $(LOCAL_PATH)/trueaudio\
        $(LOCAL_PATH)/wavpack\
        $(LOCAL_PATH)/xm

FILE_LIST := $(foreach dir, $(LOCAL_EXPORT_C_INCLUDES), $(wildcard $(dir)/*.cpp))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

LOCAL_EXPORT_CFLAGS := -DFOO=1
LOCAL_EXPORT_LDLIBS := -llog

LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_PATH := $(MY_PATH)
LOCAL_MODULE := my_own_shared_lib
LOCAL_SHARED_LIBRARIES := taglib_module
LOCAL_SRC_FILES := tag_lib_personal.cpp

LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)

请注意,在您的 Java 中,您将加载这两个库,并且顺序很重要:

Runtime.loadLibrary("taglib_module");
Runtime.loadLibrary("my_own_shared_lib");
于 2014-04-09T04:11:45.457 回答