的Andr​​oid NDK R8E丢失文件stdlib.h [英] Android NDK R8E missing stdlib.h

查看:781
本文介绍了的Andr​​oid NDK R8E丢失文件stdlib.h的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我测试了一些本地库code的Andr​​oid NDK(Android的NDK-R8E)。本机库将被从其生成文件,而不是Android的修改构建系统构建的。使用Makefile而不是Android的编译系统是项目需求(OpenSSL和FIPS)。

图书馆需要的API 14(安卓4.0),API 16(安卓4.1),和17 API待建(安卓4.2)。虽然它的使用库的makefile文件,我们从Android的NDK-R8E-的Linux-x86_64的使用prebuilt工具链(ARM-Linux的androideabi-4.7和朋友)。

看起来文件stdlib.h 从2 3的API失踪。例如,下面是编译关于API 17的一个尝试。

  ARM-Linux的androideabi-gcc的-I。 -I .. -I ../包括-DOPENSSL_FIPSCANISTER -fPIC -DOPENSSL_PIC
-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa, -  noexecstack -march =的ARMv7-A
-mandroid -I /选择/ Android的NDK-R8E /平台/ Android为17 /弓臂/ usr / include目录
-B的/ opt / Android的NDK-R8E /平台/ Android为17 /弓臂/ usr / lib目录-O3 -fomit帧指针-Wall
-DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM
-DGHASH_ASM -c -o cryptlib.o cryptlib.c
在文件中包括来自cryptlib.c:117:0:
cryptlib.h:62:20:​​致命错误:stdlib.h中:没有这样的文件或目录
 

根据从Auselen和克里斯的反馈,我试图建立一个工具链的API 17.失败:

  $ $ ANDROID_NDK_ROOT /建设/工具/ make-standalone-toolchain.sh --platform =机器人-17 --install-DIR = / Android的testAuto-配置: - 工具链=臂的Linux androideabi-4.6
无效的平台名称:机器人-17
请使用--platform =<名称>与之一:安卓-14的android-3的android-4的android-5机器人-8的android-9
 

一个人如何处理缺失的NDK头?


  $找到的/ opt / Android的NDK-R8E / -iname stdlib.h中
/opt/android-ndk-r8e/platforms/android-5/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-mips/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-x86/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-mips/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-x86/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-8/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-4/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-3/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/stlport/stlport/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/tr1/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.7/include/tr1/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.4.3/include/tr1/stdlib.h
 

解决方案

您应该创建的从NDK独立的工具链,并使用一个来构建你的本机库。 你可能需要在命令行或内部的Makefile修改环境变量,如 CC LD 来指向这个新工具链的 GCC 。是这样的:

  CC =臂的Linux androideabi-GCC --sysroot = $ SYS_ROOT
LD =臂的Linux androideabi-LD
 

I'm testing some native library code with the Android NDK (android-ndk-r8e). The native library is being built from its makefile rather than Android's modified build system. Using the makefile rather than Android's build system is a project requirement (OpenSSL and FIPS).

The library needs to be built for API 14 (Android 4.0), API 16 (Android 4.1), and API 17 (Android 4.2). Though its using the library's makefile, we are using the prebuilt toolchain from android-ndk-r8e-linux-x86_64 (arm-linux-androideabi-4.7 and friends).

It appears stdlib.h is missing from 2 of the 3 APIs. For example, below is an attempt to compile for API 17.

arm-linux-androideabi-gcc -I. -I.. -I../include  -DOPENSSL_FIPSCANISTER -fPIC -DOPENSSL_PIC
-DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -march=armv7-a
-mandroid -I/opt/android-ndk-r8e/platforms/android-17/arch-arm/usr/include
-B/opt/android-ndk-r8e/platforms/android-17/arch-arm/usr/lib -O3 -fomit-frame-pointer -Wall
-DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM
-DGHASH_ASM -c -o cryptlib.o cryptlib.c
In file included from cryptlib.c:117:0:
cryptlib.h:62:20: fatal error: stdlib.h: No such file or directory

Based on feedback from Auselen and Chris, I tried to build a toolchain for API 17. It failed:

$ $ANDROID_NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-17 --install-dir=./android-testAuto-config: --toolchain=arm-linux-androideabi-4.6
Invalid platform name: android-17
Please use --platform=<name> with one of: android-14 android-3 android-4 android-5 android-8 android-9

How does one handle missing headers in the NDK?


$ find /opt/android-ndk-r8e/ -iname stdlib.h
/opt/android-ndk-r8e/platforms/android-5/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-mips/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-x86/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-14/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-mips/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-x86/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-9/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-8/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-4/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/platforms/android-3/arch-arm/usr/include/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/stlport/stlport/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/tr1/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.7/include/tr1/stdlib.h
/opt/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.4.3/include/tr1/stdlib.h

解决方案

You should create a standalone toolchain from NDK, and use that one to build your native library. You will probably need to modify environment variables like CC, LD on the command line or inside Makefile to point to this new toolchain's gcc. Something like:

CC="arm-linux-androideabi-gcc --sysroot=$SYS_ROOT"
LD="arm-linux-androideabi-ld"

这篇关于的Andr​​oid NDK R8E丢失文件stdlib.h的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆