8

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 例外がスローされ、処理しないとアプリケーションがクラッシュします。

誰か助けてください!! 私はすでに何日も自分でこれを理解しようとしました!! :(

4

4 に答える 4

3

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

于 2014-10-16T21:50:08.577 に答える
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 エミュレーターの両方でテストされていれば、すべてが機能しました。

于 2013-07-10T21:15:47.700 に答える
0

PATH が壊れているようです。この問題を解決するには、次の投稿を参照してください。

Android NDK: Android.mk を別の Android.mk (階層プロジェクト構造) に含める方法は?

Android ndkエラー「そのようなファイルまたはディレクトリはありません」?

于 2013-03-08T05:57:03.810 に答える
0

解決しました!

まず第一に、Android NDK が提供するツールチェーンを使用して ComplexOperations ソースをビルドする必要がありました。これは、ドキュメンテーションに gnu コンパイラでクロスコンパイルしないことが明確に記載されているためです。それが私の最初の間違いでした。ndk-buildを実行するとcomplex.h not foundエラーが発生するため、それだけではまだ問題は解決しませんでした。Android NDK には、標準 libc の非常に限定的な実装が含まれています。これを解決するために、Android NDK の拡張実装であるCrystaX NDKを使用しました。それはすべてを解決しました!!

于 2013-03-22T08:09:18.977 に答える