我有用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可以帮助我!我已经尝试过几天自己解决这个问题! :(
答案 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)
好像你的PATH坏了。请参考以下帖子来解决此问题。
Android NDK: how to include Android.mk into another Android.mk (hierarchical project structure)?
答案 3 :(得分:0)
解决!
首先,我应该使用Android NDK提供的工具链构建我的ComplexOperations源代码,因为文档明确指出不要与gnu编译器交叉编译。这是我的第一个错误。 仅这一点还没有解决我的问题,因为当我进行ndk-build时,我仍然遇到了complex.h not found错误。 Android NDK包含标准libc的非常有限的实现。 为了解决这个问题,我使用了 CrystaX NDK ,这是Android NDK的扩展实现。这解决了一切!!