将uuid.h包含在Android NDK项目中

5
我正在使用NDK将一份C程序移植到Android上。该程序使用uuid.huuid/uuid.h库,具体根据哪个可用库进行选择。当我编译程序时,会出现错误信息uuid.h: No such file or directory
由于我是第一次使用NDK,所以我不太确定问题出在哪里。我在Windows的cygwin上使用NDK;这台计算机没有uuid.h库,还是Android不支持它?是否有一种解决方法——我可以在编译器设置中某种方式包含它?
最后,程序仅像这样使用该库:
char     *s;
uuid_t    uu;
uuid_create(&uu, NULL);
uuid_to_string(&uu, &s, 0);

也许我可以用自己的C代码模仿这种行为吗?
提前感谢您的任何帮助!
3个回答

7

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

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


谢谢你的帮助!我想我得把那段代码加入到项目中了... 你有什么最好的建议吗? - yellow
直接从AOSP中拉取代码即可。看起来你只需要uuid文件夹,其中已经包含了一个Android.mk文件。祝好运。 - Frohnzie
嘿,谢谢。我已经使用GIT拉取了文件夹,并将其添加到我的项目中并运行了ndk-build。它会生成一个“libext2_uuid.so”文件;为了将其合并,我需要创建一个头文件“uuid.h”来引用方法并在Android.mk源列表中包含.so吗? - yellow
1
使用 LOCAL_SHARED_LIBRARIES 包含 .so,并使用 LOCAL_C_INCLUDES 添加 uuid 文件夹的路径。 - Frohnzie
当源代码未作为公共API发布时,将来可能会发生变化。在使用类似的内容之前最好要有所了解。 - Suman

3
我通过在Android仓库中选择一个任意版本的库并将其编译为静态库来解决了问题。我将所有文件放在一个名为uuid的目录下的文件夹中。然后在external目录中添加了如下的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 -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk/build/cmake/android.toolchain.cmake \
    -DANDROID_NDK=/opt/android-ndk \
    -DANDROID_PLATFORM=android-23 \
    -DANDROID_STL=c++_static \
    -DANDROID_ABI=armeabi-v7a ..

1
文章UUIDs和Linux:你所需要知道的一切建议使用。
$ cat /proc/sys/kernel/random/uuid
eaf3a162-d770-4ec9-a819-ec96d429ea9f

该命令在Android中确实有效,但您的程序必须读取此文件(/proc/sys/kernel/random/uuid)而不是调用库。因此,如果您使用String getStringFromFile(String filePath)这里
getStringFromFile("/proc/sys/kernel/random/uuid")

将返回一个UUID,你可以将其打印到日志中。
D/~~~     ( 5065): uuid=418ebd25-4f6e-4431-b31e-784703ea6093

(在三星GS4上运行)


有人检查过它在Android设备上是否真正可行吗? - Dinh Viêt Hoà
它能工作,但不幸的是,libuuid提供了除生成之外的其他几个函数。因此,我认为我们必须获取Linux的源代码并进行编译。 - Lothar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接