我有一份用C语言编写的本地源代码,想要在我的Android设备(Nexus 7)上运行。我已经通过Android NDK成功进行了大量的研究和在线教程,学到了不少相关知识。 然而,我的代码使用了复杂功能库complex.h中定义的复杂数学函数。但是NDK C库似乎不支持这些复杂的功能。每当我在项目上执行ndk-build时,都会得到以下错误:
fatal error: complex.h: no such file or directory.
作为解决方案,我想从arm-linux-gnueabi获取标准math库(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"模块使用了complex.h,并且该模块已经使用编译器标志-march=armv7-a进行了静态编译。这个库在编译时没有出现任何错误或警告,但是当我运行应用程序并调用它时,出现了问题。
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异常,如果没有处理,应用程序将崩溃。
请有人帮帮我!!我已经尝试了好几天都没有解决!:(
complex.h
吗? - Stephen Canon