Android ndk build:即使在加载\u static\u库时也找不到静态预构建静态库的头文件

Android ndk build:即使在加载\u static\u库时也找不到静态预构建静态库的头文件,android,android-ndk,Android,Android Ndk,我知道这个问题以前已经被问过很多次了,我已经看过以前的答案了,但仍然没有帮到我。所以我将尽可能明确地问这个问题 我已经用android的make-standalone-toolchain.sh为x86 arch构建了一个静态库libdivecomputer.a。我已经将这个.a文件放在projectroot/jni/include下。在这个归档文件上运行ar会给我这个输出 $ ar t libdivecomputer.a version.o descriptor.o iterator.o co

我知道这个问题以前已经被问过很多次了,我已经看过以前的答案了,但仍然没有帮到我。所以我将尽可能明确地问这个问题

我已经用android的make-standalone-toolchain.sh为x86 arch构建了一个静态库libdivecomputer.a。我已经将这个.a文件放在projectroot/jni/include下。在这个归档文件上运行ar会给我这个输出

$ ar t libdivecomputer.a 
version.o
descriptor.o
iterator.o
context.o
device.o
parser.o
datetime.o
suunto_common.o
suunto_common2.o
suunto_solution.o
suunto_solution_parser.o
suunto_eon.o
suunto_eon_parser.o
suunto_vyper.o
suunto_vyper_parser.o
suunto_vyper2.o
suunto_d9.o
suunto_d9_parser.o
reefnet_sensus.o
reefnet_sensus_parser.o
reefnet_sensuspro.o
reefnet_sensuspro_parser.o
reefnet_sensusultra.o
reefnet_sensusultra_parser.o
uwatec_aladin.o
uwatec_memomouse.o
uwatec_memomouse_parser.o
uwatec_smart.o
uwatec_smart_parser.o
uwatec_meridian.o
oceanic_common.o
oceanic_atom2.o
oceanic_atom2_parser.o
oceanic_veo250.o
oceanic_veo250_parser.o
oceanic_vtpro.o
oceanic_vtpro_parser.o
mares_common.o
mares_nemo.o
mares_nemo_parser.o
mares_puck.o
mares_darwin.o
mares_darwin_parser.o
mares_iconhd.o
mares_iconhd_parser.o
ihex.o
hw_ostc.o
hw_ostc_parser.o
hw_frog.o
hw_ostc3.o
cressi_edy.o
cressi_edy_parser.o
cressi_leonardo.o
cressi_leonardo_parser.o
zeagle_n2ition3.o
atomics_cobalt.o
atomics_cobalt_parser.o
shearwater_common.o
shearwater_predator.o
shearwater_predator_parser.o
shearwater_petrel.o
diverite_nitekq.o
diverite_nitekq_parser.o
ringbuffer.o
checksum.o
array.o
buffer.o
serial_posix.o
irda_dummy.o
可以看出,它包含一个输入设备。我打算用它。 现在,我已经使用javah为应用程序生成了一个本机头。并制作了相应的C文件,其中包含单个函数。我还将device.h包含在此文件中,因为我打算稍后使用它

com_venky_Home.c Application.mk 现在,只要我使用ndk build编译它,我就会得到这个错误

$ ndk-build
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 12 in ./AndroidManifest.xml
[x86] Compile        : mylib <= com_venky_Home.c
jni/com_venky_Home.c:4:20: fatal error: device.h: No such file or directory
compilation terminated.
make: *** [obj/local/x86/objs/mylib/com_venky_Home.o] Error 1
$ndk构建
Android NDK:警告:应用程序平台Android-19比Android:minSdkVersion 12大。/AndroidManifest.xml

[x86]编译:mylib您的
device.h
不是系统头。因此,应相应地包括:

#include "device.h"

我会回答我自己的问题。 正如@alexcohn所说的,我必须确保标题(*.h)确实存在。这就是我的愚蠢。这里有两件事是必要的

1。你必须有一个图书馆。对于ndk独立构建,它应该出现在ndk arm/sysroot/usr/lib目录中。您的-l选项指定此库。请记住,名称应该是未修饰的。
例如,
libvenkatesh.so将-lvenkatesh作为库选项。

但这仅适用于格式良好的库。如果您有另一个具有所需函数实现的C文件,您可以直接将它们添加到gcc命令中
对于ex.
gcc file1.c file2.c

也可以对库文件执行此操作。如果-l选项对您来说太难理解,请直接添加库。
对于示例
gcc file.c libvenky.a libmy.so

但是对于大型项目,它很容易失控。因此-l选项是有用的
然后是-L选项。此选项指定编译器除了在标准位置搜索库文件外,还应在何处搜索库文件。添加-L选项后,可以直接链接库,而无需路径
例如,假设我的项目的lib文件夹中有多个库。

lib
 |--- liba.so  libb.so  libc.a
使用-L选项
$gcc file.c-Llib-la-lb-lc
是正确的。

2.必须具有这些库的头文件。这必须包含在代码中。(#包括声明)

那么完整的编译命令将是。
$gcc file.c-o bin/file.o-Llib-Iinclude-la-lb-lc


我希望这会有所帮助。

使用“”将其包含在said中会使编译器在同一目录中搜索头文件。但是头文件与C代码不在同一目录中。据我所知,-I选项应该足以告诉链接器在哪里查找。甚至当它被包括在其中时。我错了吗?不,
for
#include
遵循用-I指定的目录列表。我同意,在处编写的解释不是为了让人类理解。但实际上,gcc也会在-I目录中查找
包含的FLE。因此,你的问题是不同的。请验证文件
jni/include/device.h
是否实际存在。也许,文件名有错?@alexcohen我有一个非常粗糙的疑问。当我有一个静态库lib*.a时,我还需要一个头文件吗?请建议我阅读一些资料,以便对此有一个透彻的了解。您可能需要也可能不需要头文件,这与静态库无关。使用
#include
文件对于C来说不是强制性的,它们只是一种方便。无论如何,链接器找不到include文件。它应该由编译器解决,在您的例子中是gcc。而
libdivecomputer.a
库本身与这个失败的构建阶段无关。无论是
device.o
在这个库中还是其他地方。谢谢@AlexCohn。我通过在位置中包含头文件解决了这个问题。我想如果我有一个静态库,我就不需要头文件了。但我错了。
$ ndk-build
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 12 in ./AndroidManifest.xml
[x86] Compile        : mylib <= com_venky_Home.c
jni/com_venky_Home.c:4:20: fatal error: device.h: No such file or directory
compilation terminated.
make: *** [obj/local/x86/objs/mylib/com_venky_Home.o] Error 1
$ ndk-build V=1
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 12 in ./AndroidManifest.xml    
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/armeabi-v7a-hard/lib*.so ./libs/mips/lib*.so ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/armeabi-v7a-hard/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/armeabi-v7a-hard/gdb.setup ./libs/mips/gdb.setup ./libs/x86/gdb.setup
[x86] Compile        : mylib <= com_venky_Home.c
/android_ndk/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/i686-linux-android-gcc -MMD -MP -MF ./obj/local/x86/objs/mylib/com_venky_Home.o.d -ffunction-sections -funwind-tables -no-canonical-prefixes -fstack-protector -O2 -g -DNDEBUG -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -Ijni/include -Ijni -DANDROID  -Wa,--noexecstack -Wformat -Werror=format-security    -I/android_ndk/platforms/android-19/arch-x86/usr/include -c  jni/com_venky_Home.c -o ./obj/local/x86/objs/mylib/com_venky_Home.o 
jni/com_venky_Home.c:4:20: fatal error: device.h: No such file or directory
compilation terminated.
make: *** [obj/local/x86/objs/mylib/com_venky_Home.o] Error 1
#include "device.h"
lib
 |--- liba.so  libb.so  libc.a
#include <a.h>
#include <b.h>
#include <sample/c.h>
include
   |--- a.h  b.h  sample
                     |--- c.h