8

我有用 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 需要它。“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"...

如果出现此错误,则会引发 UnsatisfiedLinkError 异常,如果不处理该异常会导致应用程序崩溃。

有人可以帮帮我吗!我已经尝试自己解决这个问题好几天了!!:(

4

4 回答 4

3

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

从https://developer.android.com/tools/sdk/ndk/index.html下载最新的 NDK 修订版,complex.h 可以在/platforms/android-L/arch-arm/usr/include.

于 2014-10-16T21:50:08.577 回答
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.hnot being found 错误。我所做的只是将 complex.h 和 _mingw.h 复制到我的 jni 目录中。一切正常,代码在 x86 和 ARM 模拟器上都经过测试。

于 2013-07-10T21:15:47.700 回答
0

看来您的 PATH 已损坏。请参考以下帖子来解决此问题。

Android NDK:如何将 Android.mk 包含到另一个 Android.mk(分层项目结构)中?

android ndk错误“没有这样的文件或目录”?

于 2013-03-08T05:57:03.810 回答
0

解决了!

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

于 2013-03-22T08:09:18.977 回答