如何在Android NDK中使用complex.h?

时间:2013-03-06 14:50:10

标签: android-ndk cross-compiling glibc loadlibrary libm

我有用C编写的本机源代码,我想在我的Android设备(Nexus 7)上运行。我已经成功地使用Android NDK在Android上运行本机代码进行了大量研究和在线教程。我对此有了一些了解。 但是,我所使用的代码利用了complex.h中定义的标准数学库的复杂功能。然而,NDK C库似乎不支持复杂的功能。每当我对项目进行ndk-build时,我得到:

fatal error: complex.h: no such file or directory.

作为一个解决方案,我想从arm-linux-gnueabi获取标准数学库(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需要它。 使用arm-linux-gnueabi-gcc和编译器标志-march = armv7-a静态编译“ComplexOperations”模块。该库使用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"...

在此错误上引发UnsatisfiedLinkError异常,导致应用程序在未处理时崩溃。

有人PLEAASEE可以帮助我!我已经尝试过几天自己解决这个问题! :(

4 个答案:

答案 0 :(得分:2)

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

https://developer.android.com/tools/sdk/ndk/index.html下载最新的NDK版本,并在/platforms/android-L/arch-arm/usr/include中找到complex.h。

答案 1 :(得分:1)

我将以下行添加到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_ROOT)

我尝试过Crystax的NDK,但是我一直没有找到complex.h错误。我所做的只是将complex.h和_mingw.h复制到我的jni目录中。一切正常,代码在x86和ARM仿真器上都经过测试。

答案 2 :(得分:0)

答案 3 :(得分:0)

解决!

首先,我应该使用Android NDK提供的工具链构建我的ComplexOperations源代码,因为文档明确指出不要与gnu编译器交叉编译。这是我的第一个错误。 仅这一点还没有解决我的问题,因为当我进行ndk-build时,我仍然遇到了complex.h not found错误。 Android NDK包含标准libc的非常有限的实现。 为了解决这个问题,我使用了 CrystaX NDK ,这是Android NDK的扩展实现。这解决了一切!!