Android デバイス (Nexus 7) で実行したい C で記述されたネイティブ ソース コードがあります。私はすでに、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)
libmが必要とするだけでなく、arm-linux-gnueabi-gccのlibcをリンクする必要がありました。「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 例外がスローされ、処理しないとアプリケーションがクラッシュします。
誰か助けてください!! 私はすでに何日も自分でこれを理解しようとしました!! :(