我有用 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 异常,如果不处理该异常会导致应用程序崩溃。
有人可以帮帮我吗!我已经尝试自己解决这个问题好几天了!!:(