【问题标题】:Include uuid.h into Android NDK project将 uuid.h 包含到 Android NDK 项目中
【发布时间】:2012-08-06 22:51:28
【问题描述】:

我正在使用 NDK 将 C 程序移植到 Android 上。该程序使用uuid.huuid/uuid.h 库,具体取决于可用的库。当我编译程序时,给出错误消息uuid.h: No such file or directory

我是 NDK 的新手,所以我不完全确定问题出在哪里。我在 Windows 上使用 cygwin;电脑没有uuid.h 库还是安卓不支持?是否有解决方法 - 我可以以某种方式将其包含在编译器设置中吗?

最后,程序只像这样使用库:

char     *s;
uuid_t    uu;
uuid_create(&uu, NULL);
uuid_to_string(&uu, &s, 0);

也许我可以用我自己的 C 代码来模拟这种行为?

提前感谢您的帮助!

【问题讨论】:

    标签: android c android-ndk uuid


    【解决方案1】:

    uuid.h 不是 NDK 的一部分。你可以通过运行find /opt/android-ndk-r8b/ -name uuid.h来检查

    您可能可以从 AOSP 中提取您需要的代码。我在 master 分支中找到了external/e2fsprogs/lib/uuid/uuid.h

    【讨论】:

    • 感谢您的帮助!我想我必须将该代码合并到项目中......有什么建议最好的方法吗?
    • 直接从 AOSP 拉取代码即可。看起来您只需要 uuid 文件夹,其中已经包含一个 Android.mk 文件。祝你好运。
    • 嘿,谢谢。我已经使用 GIT 提取了该文件夹,并将其添加到我的项目中并运行 ndk-build。它吐出一个“libext2_uuid.so”文件;要合并这一点,我是否需要创建一个头文件“uuid.h”来引用这些方法并将 .so 包含在 Android.mk 源列表中?
    • 使用LOCAL_SHARED_LIBRARIES 包含.so 并使用LOCAL_C_INCLUDES 添加uuid 文件夹的路径。
    • 未作为公共API发布的源代码将来可能会发生变化时。在使用类似的东西之前更好地意识到这一点。
    【解决方案2】:

    文章UUIDs and Linux: Everything you ever need to know 建议使用

    $ cat /proc/sys/kernel/random/uuid
    eaf3a162-d770-4ec9-a819-ec96d429ea9f
    

    该命令确实适用于 Android,尽管您的程序必须读取此 (/proc/sys/kernel/random/uuid) 文件而不是调用库。

    所以如果你拿String getStringFromFile(String filePath)here

    getStringFromFile("/proc/sys/kernel/random/uuid")
    

    将返回一个 uuid,例如,您可以将其打印到日志中:

    D/~~~     ( 5065): uuid=418ebd25-4f6e-4431-b31e-784703ea6093
    

    (在三星 GS4 上运行)

    【讨论】:

    • 有人检查过它是否真的可以在 Android 设备上运行吗?
    • 它可以工作,但不幸的是 libuuid 提供了更多的功能,只是一代。所以我认为我们必须去获取linux的源代码并编译它
    【解决方案3】:

    我通过选择库的arbitrary 版本并将其编译为静态库来解决。我将文件夹中的所有文件放在一个名为uuid 的目录中。然后我在外部目录中添加了以下CMakeLists.txt

    cmake_minimum_required(VERSION 3.8)
    
    project(uuid)
    
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    
    set (SOURCE_FILES
        uuid/clear.c
        uuid/compare.c
        uuid/copy.c
        uuid/gen_uuid.c
        uuid/isnull.c
        uuid/pack.c
        uuid/parse.c
        uuid/unpack.c
        uuid/unparse.c
        uuid/uuid_time.c
    )
    
    add_definitions(
        -DHAVE_INTTYPES_H
        -DHAVE_UNISTD_H
        -DHAVE_ERRNO_H
        -DHAVE_NETINET_IN_H
        -DHAVE_SYS_IOCTL_H
        -DHAVE_SYS_MMAN_H
        -DHAVE_SYS_MOUNT_H
        -DHAVE_SYS_PRCTL_H
        -DHAVE_SYS_RESOURCE_H
        -DHAVE_SYS_SELECT_H
        -DHAVE_SYS_STAT_H
        -DHAVE_SYS_TYPES_H
        -DHAVE_STDLIB_H
        -DHAVE_STRDUP
        -DHAVE_MMAP
        -DHAVE_UTIME_H
        -DHAVE_GETPAGESIZE
        -DHAVE_LSEEK64
        -DHAVE_LSEEK64_PROTOTYPE
        -DHAVE_EXT2_IOCTLS
        -DHAVE_LINUX_FD_H
        -DHAVE_TYPE_SSIZE_T
        -DHAVE_SYS_TIME_H
        -DHAVE_SYS_PARAM_H
        -DHAVE_SYSCONF
    )
    
    add_library(uuid STATIC ${SOURCE_FILES})
    install(TARGETS uuid DESTINATION lib)
    

    最后,我确保以 NDK 为目标,向 cmake 发出以下调用:

    mkdir -p build-android-arm
    cd build-android-arm
    cmake ANDROID_ARGS="-DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk/build/cmake/android.toolchain.cmake \
        -DANDROID_NDK=/opt/android-ndk \
        -DANDROID_NATIVE_API_LEVEL=23 \
        -DANDROID_TOOLCHAIN=clang" \
        -DANDROID_ABI=armeabi-v7a ..
    

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2013-08-16
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2023-04-06
      • 2021-02-06
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多