我如何使用复杂的Android NDK.h



我有用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的libc -linux-gnu -gcc以及libm需要它。"ComplexOperations"模块是使用arm-linux-gnueabi-gcc静态编译的,编译器标志为-march=armv7-a。这个库使用了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异常,如果不处理,将导致应用程序崩溃。

有谁能帮帮我吗?我已经试了好几天了!!(

从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中找到。

我将以下行添加到Android.mk,这似乎已经解决了问题。

LOCAL_C_INCLUDES += C:UsersSamiworkspaceandroid-ndk-r8esourcescxx-stlgnu-libstdc++4.7include

不确定哪个变量将取代C:UsersSamiworkspace部分,所以如果有人知道,请告诉我。


编辑:实际上,这只是出于某种原因删除了错误,但它并没有解决我注意到的问题。在这一点上,C:UsersSamiworkspaceandroid-ndk-r8e可以用$(NDK_ROOT)代替。

我试过水晶的NDK,但我一直得到complex.h没有被发现错误。我所做的只是将complex.h和_mingw.h复制到jni目录中。如果代码在x86和ARM模拟器上进行了测试,则一切正常。

你的PATH好像坏了。请参考以下文章来解决这个问题。

Android NDK:如何包含Androidmk进入另一个Android。Mk(分级项目结构)?

android NDK错误"没有这样的文件或目录"?

解决!

首先,我应该用Android NDK提供的工具链来构建我的ComplexOperations源,因为文档清楚地说明了不要与gnu编译器交叉编译。这是我的第一个错误。这并没有解决我的问题,因为当我做ndk-build时,我仍然得到了complex.h没有发现错误。Android NDK包含一个非常有限的标准libc实现。为了解决这个问题,我使用了CrystaX NDK,这是Android NDK的扩展实现。这就解决了一切!!

相关内容

  • 没有找到相关文章

最新更新