Android ndk 如何将complex.h用于Android NDK?

Android ndk 如何将complex.h用于Android NDK?,android-ndk,cross-compiling,glibc,loadlibrary,libm,Android Ndk,Cross Compiling,Glibc,Loadlibrary,Libm,我想在我的Android设备(Nexus7)上运行用C编写的本机源代码。我已经成功地做了大量关于使用Android NDK在Android上运行本机代码的研究和在线教程。我在这方面获得了不少知识。 然而,我的代码利用了complex.h中定义的标准数学库的复杂功能。然而,NDKC库似乎不支持复杂的功能。每当我在项目上进行ndk构建时,我会得到: fatal error: complex.h: no such file or directory. 作为一种解决方案,我考虑从ARMLinuxGnu

我想在我的Android设备(Nexus7)上运行用C编写的本机源代码。我已经成功地做了大量关于使用Android NDK在Android上运行本机代码的研究和在线教程。我在这方面获得了不少知识。 然而,我的代码利用了complex.h中定义的标准数学库的复杂功能。然而,NDKC库似乎不支持复杂的功能。每当我在项目上进行ndk构建时,我会得到:

fatal error: complex.h: no such file or directory.
作为一种解决方案,我考虑从ARMLinuxGnueAbi获取标准数学库(libm.a),并将其与我的本机源代码链接起来。这是我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := StandardC
LOCAL_SRC_FILES := libc.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := mathLib
LOCAL_SRC_FILES := libm.a
LOCAL_STATIC_LIBRARIES := StandardC
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ComplexOperations
LOCAL_SRC_FILES := libComplexOperations.a
LOCAL_STATIC_LIBRARIES := mathLib
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := MySource
LOCAL_CFLAGS += -std=c99
LOCAL_SRC_FILES := com_samuel_test_ComplexOperationsLib.c
LOCAL_C_INCLUDES += /usr/arm-linux-gnueabi/include
LOCAL_STATIC_LIBRARIES := ComplexOperations
include $(BUILD_SHARED_LIBRARY)
我必须链接arm linux gnueabi gcc的libc,以及libm需要的libc。 “ComplexOperations”模块是使用带有编译器标志-march=armv7-a的arm linux gnueabi gcc静态编译的。这个库使用complex.h。 这将在没有任何错误和警告的情况下生成。但是当我运行应用程序并调用

System.loadLibrary("MySource");
我在logcat上得到这个错误:

E/dalvikvm( 3932): dlopen("/data/app-lib/com.samuel.test-1/libMySource.so") failed: Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol ".LANCHOR2" referenced by "libMySource.so"...
在此错误上,将引发一个未满足的LinkError异常,如果未处理该异常,将导致应用程序崩溃


谁能帮帮我吗!!我自己已经想了好几天了!!:(

您的路径似乎已中断。请参阅以下帖子以解决此问题

解决了

首先,我应该使用Android NDK提供的工具链构建ComplexOperations源代码,因为文档中明确指出不要与gnu编译器交叉编译。所以这是我的第一个错误。 单凭这一点还不能解决我的问题,因为我仍然有复杂的问题。h在我构建ndk时没有发现错误。Android ndk包含非常有限的标准libc实现。
为了解决这个问题,我使用了CrystaX NDK,Android NDK的一个扩展实现。这解决了所有问题!!

我在
Android.mk
中添加了以下行,这似乎已经解决了这个问题

LOCAL_C_INCLUDES += C:\Users\Sami\workspace\android-ndk-r8e\sources\cxx-stl\gnu-libstdc++\4.7\include\
不确定哪个变量将替换
C:\Users\Sami\workspace\
部分,因此如果有人知道,请告诉我


编辑: 事实上,这只是出于某种原因消除了错误,但并没有解决我注意到的问题。在这一点上,
C:\Users\Sami\workspace\android-ndk-r8e
可以替换为
$(ndk\u ROOT)

我尝试了Crystax的NDK,但我一直得到complex.h的错误。我所做的只是简单地将complex.h和_mingw.h复制到我的jni目录中。一切都很顺利。代码在x86和ARM emulator上都进行了测试。

从Android-L(ollipop)开始,NDK现在提供了complex.h头


从和complex下载最新的NDK修订版。h可以在
/platforms/android-L/arch arm/usr/include

中找到。谢谢Yasir。但是我的路径没有中断,因为编译器可以找到所有其他头。只是NDK使用的编译器不支持复杂的操作,而这些操作应该在数学库中定义。我想我是这样做的通过将仿生数学库与我的源代码链接,我已经解决了这个问题,但现在我遇到了链接错误问题!我已经对库进行了objdump,并了解到。LANCHOR2是在libc.a中定义的,我将源代码与libc.a链接在一起(参见我的Android.mk).我想我现在应该找到一种方法将libc加载到android上。android没有复杂的
。h
?你是如何解决这个问题的?你刚刚使用了CrystaX的交叉编译器?已经有一段时间了,但是如果我看一下我上面的答案,我使用了android NDK的工具链交叉编译并使用了CrystaX的NDK构建工具。也许Android ndk的ndk构建工具现在确实支持complex.h库。但如果不支持,CrystaX也会支持。祝你好运!似乎只有g++有complex.h文件。我也在考虑CrystaX交叉编译器。无论如何,Thx。你试过Sami Al-Terkawi Hasib在回答中描述的解决方案吗?他似乎已经解决了这个问题这些NDK中的“complex.h”文件似乎非常有限…我用不同的方法解决了这个问题。谢谢你的帮助。